2013-02-20 133 views
10

在C和C++中,使本地const变量static有什么优势?假设初始化不使用其他变量,在保存调用之间的值和每次调用相同的常量值之间是否有区别?C/C++静态const局部变量的用途

有效的C编译器可以忽略static吗?

在C++中,它避免了调用之间的构造/破坏,但是还有其他好处吗?

+1

而不是什么 - 到'const',静态',或根本没有修饰符? – MathSquared 2013-02-20 23:50:34

+0

我刚编辑了这个问题。假设var实际上是const。 – yukon 2013-02-20 23:52:20

+2

你可能会在这里找到你需要的东西:http://stackoverflow.com/questions/3709207/c-semantics-of-static-const-vs-const – Carl 2013-02-21 00:06:32

回答

6

它不会占用堆栈空间可能是一个好处,如果你有这样的:

static const double table[fairly_large_number] = { .... }; 

显然,建设成本也可以有足够的,如果函数被调用了很多,有大量的在仅构建对象一次中具有良好的价值。

+0

关于占用堆栈空间的观点很有意义,直到你意识到它必须被初始化,因为它是'const'。任何你愿意作为常量放入源文件的东西都可以很容易地放在堆栈上。 – 2013-02-20 23:58:48

+0

嗯,这很有帮助。另一个小问题,是一个易变的var可能被注册? – yukon 2013-02-20 23:59:32

+0

@MarkRansom:a)这取决于堆栈的大小,b)我有多少不同的东西。无论我做什么,无论哪种方式,初始化程序列表都将成为我的代码的一部分。如果它是一个机器生成的Times Roman字体的常量表,我想在我的文字处理器中进行硬编码,那么放入堆栈并不是一件好事,即使堆栈是相当大。我实际上已经编写了其中包含LARGE表的代码,因为这比在程序中创建表的代码更有意义。 – 2013-02-21 00:08:30

2

是的,它是巨大的:语义的好处。

当你把const,你不只是说编译器不应该让你修改变量。您稍后会对任何人阅读代码发表更大胆的声明:这一点永远不会改变。即使您将这个变量作为指向另一个函数的指针,也不会产生副作用。

此外,编译器可以利用这些新信息并在某些情况下优化它,具体取决于您处理的具体类型。

(要清楚,我在这里讲的关于constnon-const,不static对比non-static。)

编辑This SO answer是非常丰富了。