1

对于带有签名的函数:

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

谢谢!

4

2 回答 2

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) 

这里没有在堆栈上传递任何内容。

于 2010-03-25T18:57:13.797 回答
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) );
于 2010-03-25T18:42:56.587 回答