4
在GCC cdecl
調用約定中,我可以依賴在調用返回後我推入堆棧的參數是否相同?即使混合使用ASM和C並且啓用了優化(-O2
)?在CDECL調用約定中,我可以重用我推入堆棧的參數嗎?
在GCC cdecl
調用約定中,我可以依賴在調用返回後我推入堆棧的參數是否相同?即使混合使用ASM和C並且啓用了優化(-O2
)?在CDECL調用約定中,我可以重用我推入堆棧的參數嗎?
一句話:號
考慮以下代碼:
__cdecl int foo(int a, int b)
{
a = 5;
b = 6;
return a + b;
}
int main()
{
return foo(1, 2);
}
這產生該ASM輸出(用-O0編譯):
movl $5, 8(%ebp)
movl $6, 12(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
popl %ebp
ret
所以,很可能一個__cdecl函數來跺跺棧值。
這甚至沒有計算內嵌或其他優化魔術的可能性,因爲事情可能並不是最終放在堆棧上的。
對於C函數來說,修改它的非常量參數非常好,所以沒有。 – Michael
@Michael:ABI沒有提及任何關於'const'的參數。這是一個源代碼級的編譯時事情,不屬於ABI。這很不幸,因爲編譯器似乎幾乎沒有利用通過參數的時隙作爲臨時空間,但總是假設數據被破壞了。 –