static double m = 30000;
double foo(double x, double y) {
return x/m + y;
}
這不會贏得任何東西。 m的副本必須作出計算。 此外,如果你這樣做:
double bar(double x, double y) {
m += x + y;
return m;
}
則所有吧將改變微米。 函數(或類)之外的靜態變量實際上是具有文件範圍的全局變量。其他文件不能通過外部獲取
函數內部的靜態變量仍然像全局變量,除了同一文件中的其他函數不能直接看到它們。
const double m = 30000;
這是更好的,在許多情況下最好。如果編譯器看到這個全局常量,然後看到一個對m的引用,那麼它知道,不是生成代碼來從它以前的地方加載該值(這可能需要首先將一個文字地址加載到寄存器中)到一個寄存器或堆棧位置做計算它可以使一個寄存器爲30000,或者有時在那裏產生一個30000編碼的指令。
這樣做的缺點是編譯器必須假定其他源文件將要讀取m並且必須在目標文件中實際存儲一個副本作爲變量(但是是一個常量變量)。
我不確定它是否是標準的,但您有時可以做extern const double m = 30000;
,編譯器將使用30000來優化並假設另一個文件實際上有一個將存儲在可執行文件中的m的副本。你也可以做static const double m = 30000;
,編譯器可以假設沒有其他人會期望m的副本存儲在從源文件生成的目標代碼中。
做
#define m 30000
的風險更高。如果先前有另一個m聲明爲變量,常量或函數,則不會收到警告或錯誤。另外,對於像這樣的預處理宏,很容易搞砸。 例如:
#define BASE_ADDRESS 48
#define MY_OFFSET 9
#define MY_ADDRESS BASE_ADDRESS+MY_OFFSET
...
return MY_ADDRESS*4;
是的,這是一個愚蠢的例子,但是這是什麼樣子之後的預處理器被用它做是
...
return 48+9*4;
這是
return 48+(9*4);
而這不是你可能想要的。
宏是壞的另一個地方是當你有很大的常量,如字符串。字符串要求它們可以通過指針進行尋址,並且比整數和浮點文字或常數更難於優化。你可以很容易地使一個非常大的項目,如果你有很多的東西,如:
#define JIM "Jim"
#define JOHN "John"
,然後用JIM和約翰都在你的程序,因爲編譯器可能無法看到你真的只需要字符串「 Jom「和」John「一次在節目中。
這就是說,看到常量是這樣宣佈的並不少見,而且常常是由知道自己在做什麼的人以正確的方式完成的。
謝謝大家的有趣答案。所以我認爲在我的情況最好的事情是有靜態const double = 30000。 – yCalleecharan 2010-04-09 21:39:49