Uri*_*Uri 34
从名称中可以猜出,变量随时间而变化.如果它没有变化,则"没有损失".当你告诉编译器值不会改变时,编译器可以进行一大堆优化,比如直接内联值,永远不会为堆栈上的常量分配任何空间.
但是,您不能始终指望您的编译器足够智能,以便能够正确确定一旦设置值是否会更改.在编译器无法100%置信地确定此情况的任何情况下,编译器都会在安全方面犯错并假设它可能会发生变化.这可能会导致各种性能影响,如避免内联,不优化某些循环,创建不兼容并行性的目标代码.
因此,并且由于可读性也很重要,因此您应尽可能使用显式常量,并为可能实际更改的内容保留变量.
至于为什么使用常量而不是文字数字:
1)它使代码更具可读性.每个人都知道3.14是什么(希望如此),并不是每个人都知道3.07是PA的所得税税率.这是特定于域的知识的一个示例,并不是每个人在将来维护您的代码(例如,税务软件)都会知道它.
2)进行更改时可以节省工作量.如果将来税率发生变化,每隔3.07变为3.18将会很烦人.您总是希望最大限度地减少更改,并且最好进行一次更改.您必须进行的并发更改越多,您忘记某些内容的风险就越高,从而导致错误.
3)您可以避免风险错误.想象一下,有两个州的所得税税率为3.05,然后其中一个州变为3.18,而另一个州则为3.07.只需要进行更换,就可能会出现严重错误.当然,许多整数或字符串常量值比"3.07"更常见.例如,数字7可以表示一周中的天数,以及其他内容.在大型程序中,很难确定每个字面值的含义.
4)对于字符串文本,通常使用字符串的符号名称以允许字符串池在支持多种语言的情况下快速更改.
请注意,除了变量和"常量变量"之外,还有一些带有枚举的语言.枚举实际上允许您为一小组常量(例如,返回值)定义类型,因此使用它们将提供类型安全性.
例如,如果我列出了几周和几个月的日期,如果我指定一个月的一天,我会收到警告.如果我只使用整数常量,那么当第3天分配给第3个月时就没有警告.您总是希望类型安全,并且它提高了可读性.枚举也更适合定义顺序.想象一下,你有一周中几天的常数,现在你希望你的星期在星期一而不是星期日开始.
小智 16
使用常量更像是一种防御性编程方式,可以保护自己免受自己的伤害,在凌晨2点或在喝完咖啡之前,不会在代码中的某个地方意外更改值.
从技术上讲,是的,您可以使用变量.
Mic*_*ael 11
常量与变量相比有几个优点.
常量提供某种程度的保证,即代码不能改变基础值.这对于较小的项目来说并不重要,但对于由多位作者编写的多个组件的大型项目而言则很重要.
常量还为编译器提供了强大的优化提示.由于编译器知道值无法更改,因此不需要从内存加载值,并且可以优化代码仅适用于常量的精确值(例如,编译器可以使用移位进行乘法/除法如果const是2的幂.)
常量本身也是静态的 - 您可以在头文件中声明常量及其值,而不必担心将其定义为一个位置.
Pav*_*sky 10
一,性能优化.
更重要的是,这是针对人类读者的.请记住,您的目标受众不仅仅是编译器.它有助于在代码中表达自己,并避免评论.
const int spaceTimeDimensions = 4;
if(gpsSattelitesAvailable >= spaceTimeDimensions)
Good();
Run Code Online (Sandbox Code Playgroud)