|
|
1
25
如果您将一个变量声明为常量,那么优化器通常可以通过“常量折叠”来消除它,从而既加快了程序的速度,又节省了空间。举个例子,考虑一下:
编译器最终将创建一条指令,将a乘以7,并将其传递给“process”,将结果存储在c中。但是在这种情况下:
|
|
2
21
|
|
3
7
这在很大程度上取决于你的优化器有多好。 一个好的优化器将在编译期间用文本值替换常量引用。这节省了处理器周期,因为生成的机器代码使用的是即时值,而不必从内存中加载值。 一些 优化器将识别一个值在声明之后没有被修改,并将它转换为一个常量。不要依赖这种行为。 而且,只要有可能,您的代码应该强制执行您在开发过程中所做的假设。如果一个“变量”永远不应该被更改,那么将它声明为一个常量将有助于确保您自己和以后出现的任何其他开发人员都不会无意中修改一个“常量”。 |
|
|
4
4
将一个变量标记为常量表明了您作为程序员的意图,即无论何时在代码执行期间访问它,它都将是一个一致的值。将其视为一种文档形式,也可以使编译器参与到设计中。 |
|
5
3
正如您所指出的,将不变的变量更改为显式常量可能没有任何直接的好处。然而,在分析一个程序时,要做的一个检查是查看变量的声明点到变量的引用点。因此,诸如在声明之前被访问的变量,或者在引用之前被设置和重置的变量等指标可能会指示bug。
对于使用您的代码的其他开发人员也是如此。他们可能无意中设置了一个变量,而您可能没有意识到。声明常量可以避免这些类型的错误。 |
|
6
3
所以那是给定的
这两个分支都必须是可编译的——这是一个优化,而不是
|
|
|
7
2
一个好处是,如果它真的是一个常量,您不会意外地更改它。这个常数让你以后不会把事情搞砸。作为一个变量,任何人都可以在以后更新代码时修改它。 应该清楚哪些价值观永远不会改变,哪些价值观可以改变。不断强化你的意图。
|
|
|
8
2
除了已经说过的以外,将变量声明为常量可以为优化器提供更多的自由度。它可以消除读取它的值,它可以消除创建临时副本的需要,它可以消除变量本身(这对于数值常量尤其如此)。
常量的另一个大用例是常量对象。拥有一个常量对象(或者在函数中提供对常量对象的引用)可以确保对象没有被修改,只有方法(调用
|
|
|
9
2
根据语言的不同,另一种可能性是编译器可以在多线程环境中进行一些优化,而这些优化在其他情况下是不可能的。就像你说:
在多线程环境中,如果f是一个变量,编译器可能必须在第二个操作之前重新生成f。如果f是一个常量,并且编译器知道它仍在寄存器中,则不需要重新加载。 |
|
10
2
当然,对于C和Ada这样的语言,编译器会将常量中的值直接放入汇编指令中,这意味着除了运行程序所需的内容外,不需要交换寄存器或从内存中读取内容。这意味着两件事:一是速度(在许多应用程序中可能不太明显,除非它们是嵌入式的),二是内存使用(程序的最终二进制大小和运行时内存占用)。
其次,正如ITSMAT和JBARL所述,它使您可以逻辑地将项目视为常数配置项而不是“变量”;尤其是在高级编程语言和解释语言中。 |
|
11
2
还有另一个好处,堆栈和数据段的大小。 考虑:
每次该函数递归时,都会在堆栈上创建一个320字节的结构。但由于a的值不变,堆栈将增加以保持一个常量变量。这在具有小堆栈的嵌入式平台上非常重要。
|
|
12
2
这并不是Ada特有的问题。 常数对变量的一般好处:
Ada特定益处:
|
|
|
13
1
常量通常存储在只读内存中,这样可以防止在执行过程中更改常量,访问它们的速度可能更快,或者至少与访问RAM的速度一样快。 |
|
|
14
0
常量与变量的一个重要区别在于,一旦一个值被赋予一个常量,它就不能随之改变。
|
|
|
Sudhanva c · 如何提高编码技能?[已关闭] 8 年前 |
|
|
hoffm · 为什么Ruby找不到调用方类中定义的常量? 8 年前 |
|
|
Thamme Gowda · “lambda”关键字的较短替代项? 8 年前 |
|
|
AlphaModder · 有没有带有“不寻常”访问修饰符的编程语言? 11 年前 |
|
|
lucasasecas · 有可能静态地使用动态语言吗? 11 年前 |
|
|
Eugenio Laghi · 仅由括号、加号和感叹号组成的语言 11 年前 |
|
dallin · 数组中的逗号运算符是否有名称? 12 年前 |