在C和C++中,使本地const
变量static
有什么优势?假设初始化不使用其他变量,在保存调用之间的值和每次调用相同的常量值之间是否有区别?C/C++静态const局部变量的用途
有效的C编译器可以忽略static
吗?
在C++中,它避免了调用之间的构造/破坏,但是还有其他好处吗?
在C和C++中,使本地const
变量static
有什么优势?假设初始化不使用其他变量,在保存调用之间的值和每次调用相同的常量值之间是否有区别?C/C++静态const局部变量的用途
有效的C编译器可以忽略static
吗?
在C++中,它避免了调用之间的构造/破坏,但是还有其他好处吗?
它不会占用堆栈空间可能是一个好处,如果你有这样的:
static const double table[fairly_large_number] = { .... };
显然,建设成本也可以有足够的,如果函数被调用了很多,有大量的在仅构建对象一次中具有良好的价值。
关于占用堆栈空间的观点很有意义,直到你意识到它必须被初始化,因为它是'const'。任何你愿意作为常量放入源文件的东西都可以很容易地放在堆栈上。 – 2013-02-20 23:58:48
嗯,这很有帮助。另一个小问题,是一个易变的var可能被注册? – yukon 2013-02-20 23:59:32
@MarkRansom:a)这取决于堆栈的大小,b)我有多少不同的东西。无论我做什么,无论哪种方式,初始化程序列表都将成为我的代码的一部分。如果它是一个机器生成的Times Roman字体的常量表,我想在我的文字处理器中进行硬编码,那么放入堆栈并不是一件好事,即使堆栈是相当大。我实际上已经编写了其中包含LARGE表的代码,因为这比在程序中创建表的代码更有意义。 – 2013-02-21 00:08:30
是的,它是巨大的:语义的好处。
当你把const
,你不只是说编译器不应该让你修改变量。您稍后会对任何人阅读代码发表更大胆的声明:这一点永远不会改变。即使您将这个变量作为指向另一个函数的指针,也不会产生副作用。
此外,编译器可以利用这些新信息并在某些情况下优化它,具体取决于您处理的具体类型。
(要清楚,我在这里讲的关于const
与non-const
,不static
对比non-static
。)
编辑:This SO answer是非常丰富了。
而不是什么 - 到'const',静态',或根本没有修饰符? – MathSquared 2013-02-20 23:50:34
我刚编辑了这个问题。假设var实际上是const。 – yukon 2013-02-20 23:52:20
你可能会在这里找到你需要的东西:http://stackoverflow.com/questions/3709207/c-semantics-of-static-const-vs-const – Carl 2013-02-21 00:06:32