首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法让MSVC在x64的寄存器中传递结构参数?

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

Stack Overflow用户
提问于 2010-03-26 02:36:15
回答 2查看 368关注 0票数 0

对于带签名的函数:

代码语言:javascript
复制
struct Pair { void *v1, *v2 };
void f(Pair p);

在x64上编译时,我希望通过寄存器传递Pair的字段,就好像函数是:

代码语言:javascript
复制
void f(void *v1, void *v2);

在OSX10.6上用gcc 4.2.1为x86_64编译了一个测试,通过检查反汇编,我可以看到这正是发生了什么。但是,在Windows上使用MSVC2008for x64进行编译时,反汇编显示Pair是在堆栈上传递的。我知道平台ABI可以阻止这种优化;有谁知道任何特定于MSVC的注释、调用约定、标志或其他可以使其工作的技巧吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-03-26 02:57:14

我的VS2008 x64编译器做的事情和你的不一样。该结构适用于XMM寄存器,它传递一个指针,指向寄存器中pair对象的副本:

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2010-03-26 02:42:57

如果你这样做了呢?

代码语言:javascript
复制
   void f( void *ps ){
       struct Pair *p = (struct Pair *)ps;
   }

代码语言:javascript
复制
void f( unsigned long addr ){
    struct Pair *p = (struct Pair *)addr;
}

struct Pair pp;

f( reinterpret_cast<unsigned long>(&pp) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2518366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档