对于带签名的函数:
struct Pair { void *v1, *v2 };
void f(Pair p);在x64上编译时,我希望通过寄存器传递Pair的字段,就好像函数是:
void f(void *v1, void *v2);在OSX10.6上用gcc 4.2.1为x86_64编译了一个测试,通过检查反汇编,我可以看到这正是发生了什么。但是,在Windows上使用MSVC2008for x64进行编译时,反汇编显示Pair是在堆栈上传递的。我知道平台ABI可以阻止这种优化;有谁知道任何特定于MSVC的注释、调用约定、标志或其他可以使其工作的技巧吗?
谢谢!
发布于 2010-03-26 02:57:14
我的VS2008 x64编译器做的事情和你的不一样。该结构适用于XMM寄存器,它传递一个指针,指向寄存器中pair对象的副本:
Pair p;
f(p);
000000013F2B1189 movaps xmm6,xmmword ptr [p]
000000013F2B118E lea rcx,[p]
000000013F2B1193 movdqa xmmword ptr [p],xmm6
000000013F2B1199 call f (13F2B1000h) 这里没有向堆栈传递任何内容。
发布于 2010-03-26 02:42:57
如果你这样做了呢?
void f( void *ps ){
struct Pair *p = (struct Pair *)ps;
}或
void f( unsigned long addr ){
struct Pair *p = (struct Pair *)addr;
}
struct Pair pp;
f( reinterpret_cast<unsigned long>(&pp) );https://stackoverflow.com/questions/2518366
复制相似问题