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