在我的32位x86 Ubuntu11.10上,gcc4.6.3通过堆栈传递参数。是否存在强制gcc通过寄存器传递参数的gcc优化?那gcc怎么做到的?我想要一些细节。
答案 0 :(得分:6)
相关属性为__attribute__((fastcall))
。使用此属性声明的函数将在ECX中使用其第一个符合条件的参数进行调用,在EDX中调用第二个参数。
(我假设是x86。你刚才说了32位,但它涵盖了很多架构,比如ARM)。
答案 1 :(得分:3)
GCC在你的情况下在堆栈上传递参数,因为Linux-x86 ABI指定了这一点。使用fastcall函数属性,您可以更改它,这当然会破坏ABI并导致各种问题。
解决方案可以是切换到x86-64,其中ABI指定(某些)参数由寄存器传递。或者,如果你喜欢前沿的东西,新的x32 ABI类似于x86-64 ABI,但有32位指针。