2011-04-09 127 views
0

嗨 我感興趣的是什麼是彙編代碼的gcc從這個代碼生成(這只是虛擬的代碼來說明我的觀點):GCC寄存器優化

int a = 0; 
int foo(void) 
{ 
    int result = a; 
    a += 2; 
    return result; 
} 

我驚訝於該GCC拷貝的變量來堆棧然後從堆棧到寄存器,以便它可以返回它。當我在寄存器中添加結果聲明時,它優化了代碼而不是使用堆棧,而是直接將變量複製到寄存器中。我知道這並沒有什麼區別,但我想知道gcc是否沒有任何好理由暗中做出這樣的優化。我希望我明確表示我在說什麼...

任何想法?

+5

您應該提供編譯器版本,命令行和彙編輸出。 – 2011-04-09 14:38:47

+0

帕斯卡爾的評論+1。在談論諸如編譯器優化之類的細節時,儘可能給這裏的人們儘可能多的上下文。 (也就是說,這聽起來像你沒有使用最積極的優化。) – 2011-04-09 14:41:08

+0

這裏最重要的部分可能是你編譯這個代碼是否啓用優化 – nos 2011-04-09 14:45:48

回答

7

編譯Debug版本(即優化關閉)時,編譯器傾向於製作非常簡單易調試的代碼。在這種情況下,它可能意味着將所有變量保存在內存/堆棧中,而不是寄存器中。

嘗試使用完全優化編譯(-O3),看看是否有所作爲。

+0

我測試過,我認爲你是對的。謝謝:) – martinkunev 2011-04-09 14:45:32

+0

又是一個PEBCAK – hirschhornsalz 2011-04-10 08:49:05