有没有办法让 MSVC 在 x64 上的寄存器中传递结构参数?
对于具有签名的函数:
struct Pair { void *v1, *v2 };
void f(Pair p);
在 x64 上编译,我希望通过寄存器传递 Pair 的字段,就好像该函数是:
void f(void *v1, void *v2);
在 OSX 10.6 上使用 gcc 4.2.1 for x86_64 编译测试一样,通过检查反汇编,我可以看到这正是发生的情况。但是,在 Windows 上使用 MSVC 2008 for x64 进行编译时,反汇编显示 Pair
在堆栈上传递。我了解平台 ABI 可以阻止这种优化;有谁知道任何 MSVC 特定的注释、调用约定、标志或其他可以让它工作的技巧吗?
谢谢你!
For a function with signature:
struct Pair { void *v1, *v2 };
void f(Pair p);
compiled on x64, I would like Pair
's fields to be passed via register, as if the function was:
void f(void *v1, void *v2);
Compiling a test with gcc 4.2.1 for x86_64 on OSX 10.6, I can see this is exactly what happens by examining the disassembly. However, compiling with MSVC 2008 for x64 on Windows, the disassembly shows that Pair
is passed on the stack. I understand that platform ABIs can prevent this optimization; does anyone know any MSVC-specific annotations, calling conventions, flags, or other hacks that can get this to work?
Thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我的 VS2008 x64 编译器不会执行与您相同的操作。该结构适合 XMM 寄存器,它传递一个指向寄存器中pair对象副本的指针:
这里没有在堆栈上传递任何内容。
My VS2008 x64 compiler doesn't do the same thing yours does. The struct fits in an XMM register, it passes a pointer to the copy of the pair object in a register:
Nothing is passed on the stack here.
如果你这样做怎么办?
或者
what if you do this ?
or