可能重複:
Constants and compiler optimization in C++const是否可以幫助優化器? C++
讓聖戰開始: 我聽說了一些關於爲const在C++用處不同意見的。當然,它在成員函數聲明中有用,但是它對變量(或者說,常量)的修飾符有多大用處?如果剩下的代碼保持不變,是否確實有助於優化器?
可能重複:
Constants and compiler optimization in C++const是否可以幫助優化器? C++
讓聖戰開始: 我聽說了一些關於爲const在C++用處不同意見的。當然,它在成員函數聲明中有用,但是它對變量(或者說,常量)的修飾符有多大用處?如果剩下的代碼保持不變,是否確實有助於優化器?
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
很弱 - 只是類型系統的一個關鍵字。
請注意,拋棄固有常量對象的常量是未定義的行爲。 – 2010-10-09 17:32:21
它不會傷害,理論上可以允許一些優化,所以你可以使用它 - 不知道是否有生產編譯器。
一般來說,不,它不會幫助編譯器。由於C和C++都可以在一秒鐘內拋出常量,因此編譯器很難對滿足的優化代碼要求做出必要的假設。
也就是說,const正確性應該總是用於其他好處。
嗯,是的,它可以被丟棄,但如果你在編譯器背後做它,它會導致未定義的行爲。如果你使用正常的強制轉換,那麼編譯器知道他必須放棄強制的確切點。 – 2010-10-09 16:22:51
很多情況下,const修飾符不會幫助優化器,因爲編譯器已經可以告訴您是否修改了變量。在我看來,const的最大好處是它告訴編譯器程序員是否打算修改該變量,這在編譯時而不是運行時找到某些類型的語義錯誤很有用。您可以遷移到編譯時間的任何錯誤都是程序員生產力的巨大提升。
我會說這有些誇張。對於微不足道的東西是的,一旦你超越了通話邊界,哦,好吧......無論如何,把一個缺少的const修飾符看作是必須修復的語義錯誤是非常好的。 – 2010-10-09 16:20:22
這將取決於優化器,現在不是嗎? – dmckee 2010-10-09 17:13:08