3

在我的 32 位 x86 Ubuntu11.10 上,gcc4.6.3 通过堆栈传递参数。是否有任何 gcc 优化强制 gcc 通过寄存器传递参数?以及 gcc 是如何做到的?我想要一些细节,请。

4

2 回答 2

6

相关属性是__attribute__((fastcall))。使用此属性声明的函数在 ECX 中使用它们的第一个合格参数调用,在 EDX 中使用第二个合格参数调用。

(我假设 x86。你刚刚说的是 32 位,但这涵盖了许多架构,例如 ARM)。

于 2012-07-20T08:35:21.940 回答
3

在您的情况下,GCC 在堆栈上传递参数,因为 Linux-x86 ABI 指定了这一点。使用 fastcall 函数属性,您可以更改它,这当然会破坏 ABI 并因此导致各种问题。

一个解决方案可能是切换到 x86-64,其中 ABI 指定(某些)参数由寄存器传递。或者,如果您喜欢最前沿的东西,新的 x32 ABI 类似于 x86-64 ABI,但具有 32 位指针。

于 2012-07-20T08:28:46.693 回答