2010-10-09 68 views

回答

4

const不能幫助優化器。

由於const可以拋棄與const_cast,有可能按照標準來寫,在許多地方使用const程序,再抹上它扔掉,反正修改變量,以定義的行爲。因此,編譯器必須查看程序的實際代碼,以確定哪些變量在什麼時候被修改,而且它可能相當不錯(例如,它可能會確定非const變量對某個代碼塊不變,並相應地進行優化)。

如果編譯器盲目地將const作爲保證某些東西不會改變,那麼優化器會破壞一些格式良好的程序。

const 是一個編譯時功能,通過添加一些編譯時間約束和指示代碼合同(例如'我保證不更改此參數')來幫助程序員編寫正確的代碼。它與優化無關。雖然不變量對優化器很重要,但這與const關鍵字無關。

有一個例外:使用const聲明的對象。這些不能修改;即使他們通過鑄造,行爲也是未定義的。這裏也有一些微妙的位置:

const int ci = 5; 
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const 

int i = 5; 
const int& ci2 = i;  // cannot modify i through ci2, const reference 
const_cast<int&>(ci2) = 5; // OK, original object not declared const 

所以當編譯器看到const int ci它可能確實假定它會永遠,永遠改變,因爲修改它是未定義的行爲。然而,這可能不是您程序中的瓶頸,而只是更復雜的#define。除此之外,const很弱 - 只是類型系統的一個關鍵字。

+1

請注意,拋棄固有常量對象的常量是未定義的行爲。 – 2010-10-09 17:32:21

0

它不會傷害,理論上可以允許一些優化,所以你可以使用它 - 不知道是否有生產編譯器。

5

一般來說,不,它不會幫助編譯器。由於C和C++都可以在一秒鐘內拋出常量,因此編譯器很難對滿足的優化代碼要求做出必要的假設。

也就是說,const正確性應該總是用於其他好處。

+0

嗯,是的,它可以被丟棄,但如果你在編譯器背後做它,它會導致未定義的行爲。如果你使用正常的強制轉換,那麼編譯器知道他必須放棄強制的確切點。 – 2010-10-09 16:22:51

17

很多情況下,const修飾符不會幫助優化器,因爲編譯器已經可以告訴您是否修改了變量。在我看來,const的最大好處是它告訴編譯器程序員是否打算修改該變量,這在編譯時而不是運行時找到某些類型的語義錯誤很有用。您可以遷移到編譯時間的任何錯誤都是程序員生產力的巨大提升。

+1

我會說這有些誇張。對於微不足道的東西是的,一旦你超越了通話邊界,哦,好吧......無論如何,把一個缺少的const修飾符看作是必須修復的語義錯誤是非常好的。 – 2010-10-09 16:20:22