前一篇裡提到不論用 const 和 #define 定義常數,對目的碼品質基本上沒有差別,const 這個關鍵字只是協助語意測試,處理完就丟掉了。

不過有另一種聲音認為,加不加 const 有時候會造成效能上的差異。他們的論點是這樣的:這是因為有些單晶片編譯器會把常數資料區放在 ROM 上,要是使用外部 ROM 的話讀取速度可能變慢。

雖然背後的觀念大致上是對的,但還可以再挑些語病。

首先,這種說法混淆了「程式的常數資料區」和「C/C++ 的 const 屬性」,兩者不可以畫上等號。帶有 const 屬性本身並不蘊含資料存在常數資料區的意義,要看程式語意以及編譯器如何處理。

以 C++ 或較新式的 C 寫法來說,鼓勵 const 目的真的只是強化語意檢查,很多帶 const 屬性的東西只能在執行期得知,絕對不可能在常數資料區內。另外像上一篇提到的 integer literal 和編譯期常算式,很顯然用機器指令的 immediate value 吸收掉再自然不過了,既不在一般記憶體也不在常數資料區。

真正會放在常數資料區的東西通常是 string literal 和陣列初始值之類的,隨著程式的載入和變數初始化,資料才會複製到變數所在的記憶體上。單晶片環境 RAM 常常很吃緊,將查表用的陣列放在 RAM 上是非常浪費的事。加不加 const 主要的差異在於,如果確定這些東西不會在執行期更動,那麼可以告訴編譯器不必在一般記憶體上額外建立變數,而是直接使用常數資料區上面的資料。不過要注意並非所有具有 const 屬性的東西都是這樣,真正有影響力的只有 global、static 這些在編譯期可以決定的 const。

除了加 const,通常還必須使用特殊的關鍵字,例如下面 AVR-GCC的範例 http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003

最後還是要看編譯器如何設定,以及程式設計者如何規劃記憶體,光在程式碼上斤斤計較未必得到想要的結果。

總之,這個說法有其道理,但不要因此以為所有的 const 都會影響效能而捨棄囊中利箭。

novus 發表在 痞客邦 PIXNET 留言(0) 人氣()