有没有办法让MSVC在x64上的寄存器中传递结构参数?

时间:2010-03-25 18:36:15

标签: c++ c compiler-optimization

对于带签名的函数:

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的注释,调用约定,标志或其他可以使其工作的黑客?

谢谢!

2 个答案:

答案 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) );