对于带签名的函数:
struct Pair { void *v1, *v2 };
void f(Pair p);
在x64上编译,我希望Pair
的字段通过寄存器传递,就像函数是:
void f(void *v1, void *v2);
在OSX 10.6上使用gcc 4.2.1为x86_64编译测试,我可以看到这正是检查反汇编所发生的情况。但是,在Windows上使用MSVC 2008 for x64进行编译时,反汇编显示在堆栈上传递了Pair
。据我所知,平台ABI可以阻止这种优化;有没有人知道任何特定于MSVC的注释,调用约定,标志或其他可以使其工作的黑客?
谢谢!
答案 0 :(得分:1)
我的VS2008 x64编译器不会做同样的事情。该结构适合XMM寄存器,它将指针传递给寄存器中对对象的副本:
Pair p;
f(p);
000000013F2B1189 movaps xmm6,xmmword ptr [p]
000000013F2B118E lea rcx,[p]
000000013F2B1193 movdqa xmmword ptr [p],xmm6
000000013F2B1199 call f (13F2B1000h)
此处没有在堆栈上传递任何内容。
答案 1 :(得分:0)
如果你这样做会怎么样?
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) );