我曾經在嵌入式系統的項目中工作過,在那裏我們重新安排了堆棧變量的聲明順序,以減小生成的可執行文件的大小。舉例來說,如果我們有:C編譯器能否重新安排堆棧變量?
void func()
{
char c;
int i;
short s;
...
}
我們將重新排序這是:
void func()
{
int i;
short s;
char c;
...
}
由於對準問題的第一個導致12個字節的堆棧空間被使用,第二個導致只有8個字節。
這是C編譯器的標準行爲還是我們使用的編譯器的缺點?
在我看來,編譯器應該能夠重新排序堆棧變量,以支持更小的可執行文件大小,如果它想的話。有人向我建議,C標準的某些方面可以防止這種情況發生,但我無法以任何方式找到有信譽的來源。
作爲一個額外的問題,這是否也適用於C++編譯器?
編輯
如果答案是肯定的,C/C++編譯器可以重新排列堆棧變量,你可以給一個編譯器,絕對做到這一點的例子嗎?我希望看到編譯器文檔或類似的東西來支持它。
再次編輯
謝謝大家的幫助。對於文檔,我能找到的最好的東西是文件Optimal Stack Slot Assignment in GCC(pdf),由Naveen Sharma和Sanjiv Kumar Gupta在2003年GCC峯會會議上提交。
這裏的問題項目是使用ADS編譯器進行ARM開發。在該編譯器的文檔中提到,由於ARM-Thumb體系結構如何計算本地堆棧幀中的地址,因此像我所示的排序聲明可以提高性能以及堆棧大小。該編譯器不會自動重新安排當地人利用這一點。這裏鏈接的文章說,從2003年起,GCC也沒有重新安排堆棧框架來改善ARM-Thumb處理器的參考位置,但這意味着您可以。
我無法找到任何明確表示這已在GCC中實施的任何內容,但我認爲這篇論文被認爲是證明你們都是正確的。再次感謝。
這是一個很好的觀點。當我和我的同事討論這件事時,我並沒有這樣做。 – 2008-10-26 19:27:52
它甚至可以將多個變量分配到相同的寄存器或堆棧位置,如果它可以證明變量在相同的代碼段中從不存在。這是很常見的做法,特別是內聯代碼會導致短暫的可變生命。 – 2008-10-26 21:05:51