2012-07-20 29 views
2

在我的32位x86 Ubuntu11.10上,gcc4.6.3通過堆棧傳遞參數。有沒有強制gcc通過寄存器傳遞參數的gcc優化?以及gcc如何做到這一點?我想要一些細節。讓gcc通過寄存器傳遞參數

+0

[調用約定 爲不同的C++編譯器和操作系統](http://www.agner.org/optimize/calling_conventions.pdf) – 2012-07-20 08:36:52

回答

5

相關屬性爲__attribute__((fastcall))。使用此屬性聲明的函數在ECX中以其第一個合格參數調用,在EDX中以第二個參數調用。 (我假設x86,你只是說了32位,但涵蓋了許多架構,如ARM)。

+0

只能使用兩個寄存器? – KUN 2012-07-20 08:45:08

+0

@KUN:這是x86。它沒有那麼多的寄存器開始。 – MSalters 2012-07-20 08:46:34

+0

你知道任何gcc優化都可以像x86-64一樣進行嗎? – KUN 2012-07-20 08:49:35

2

GCC在棧上傳遞參數,因爲Linux-x86 ABI指定了這個參數。通過fastcall函數屬性,您可以更改該屬性,這當然會破壞ABI並導致由此導致的各種問題。

一個解決方案可能是swith到x86-64,其中ABI指定(一些)參數由寄存器傳遞。或者如果你喜歡流血的東西,新的x32 ABI與x86-64 ABI類似,但是具有32位指針。

+0

我知道x86-64 ABI可以做到這一點。由於我只有32位機器,因此需要了解gcc優化是否可以做到這一點。 – KUN 2012-07-20 08:36:26