2011-10-13 65 views
2

我正在優化我的應用程序中的一些熱點,編譯使用gcc-arm完成。C++ - 常量和優化

現在,有任何機會,下面的語句將導致不同的彙編代碼:

static const pixel_t roundedwhite = 4294572537U; 
return (packed >= roundedwhite) ? purewhite : packed; 

// OR 
const pixel_t roundedwhite = 4294572537U; 
return (packed >= roundedwhite) ? purewhite : packed; 

// OR 
return (packed >= 4294572537U) ? purewhite : packed; 

是否有任何機會,我的ARM編譯器可能會產生不必要的代碼,第一種情況下或應此得到反正優化?

我認爲它是相同的,但是,不幸的是,我不知道gcc-arm與普通gcc相比,我無法訪問反彙編列表。

非常感謝。

+0

它會被優化掉。 – Dave

+9

爲什麼猜測?編譯爲彙編('-S')並進行比較。 – NPE

回答

4

呼叫gcc-S標誌,並看一看裝配:

-S

停止正常編譯階段後;不要組裝。對於指定的每個非彙編程序輸入文件,輸出採用彙編代碼文件的形式。

我會試試自己在答案中包括,但我沒有ARM編譯器方便。

1

一個區別是肯定的是,第一個版本,static將用盡一些內存,即使它的值將在表達式中內聯。如果你想計算一個更復雜的表達式然後存儲結果,這是有意義的,但對於這個簡單的常量,靜態是不必要的。也就是說,編譯器很可能會內聯該值,因爲這是一個非常簡單的優化,沒有理由不這樣做。

+0

這就是它在函數作用域之外所做的事情,但是我假定它是在函數作用域內的返回之前定義的。根據http://www.cprogramming.com/tutorial/statickeyword.html:在函數內使用靜態是最簡單的。它僅僅意味着一旦變量被初始化,它將一直保留在內存中直到程序結束。 –

+0

@LokiAstari請你在這裏詳細解釋一下嗎? –

+0

@Kotti:他的意思是,根據你定義'static const'的位置,它可以有不同的含義。如果你在函數內部定義它,就像我假設的那樣,它會分配靜態內存。如果你在函數之外定義它,在cpp中,它將意味着靜態鏈接,即const對其他文件/類不可見。 –