静态变量是否会耗尽内存?

时间:2011-10-13 13:58:39

标签: c++ static compiler-optimization

基于this讨论,我想知道函数作用域静态变量是否总是使用内存,或者是否允许编译器对其进行优化。为了说明这个问题,假设一个类似的函数:

void f() {
   static const int i = 3;
   int j = i + 1;
   printf("%d", j);
}

编译器很可能内联i的值,并且可能在编译时进行计算3 + 1。由于这是唯一使用i值的地方,因此不需要分配任何静态内存。那么编译器是允许优化静态的,还是标准要求任何静态变量都分配了内存?

3 个答案:

答案 0 :(得分:6)

根据1.8 The C++ object model n3242部分

对象具有类型和存储持续时间(可选择名称) 除非获取地址,否则它不需要内存位置。

答案 1 :(得分:6)

  

允许编译器优化静态离开[...]?

是。根据标准:

1.9程序执行

  

本国际标准中的语义描述定义了一个   参数化非确定性抽象机。这个国际   标准对符合结构没有要求   实现。特别是,他们不需要复制或模仿   抽象机器的结构。相反,符合实施   需要模仿(仅)抽象的可观察行为   机器如下所述.5)

......脚注说:

  

5)这项规定有时被称为“as-if”规则,因为a   实施可以自由地忽视任何要求   国际标准只要结果就好像要求一样   从可观察的角度来看,已经服从了   该计划的行为。例如,实际的实施需要   如果它可以推导出它的值,则不评估表达式的一部分   未使用,没有影响可观察行为的副作用   制作该节目。

这一切意味着只要可观察行为相同,编译器就可以对代码执行任何操作。由于您没有获取static const的地址,编译器可以将值优化为常量积分表达式。​​

答案 2 :(得分:0)

不,它不会总是使用内存。我的GCC版本4.5.2在-O0上生成具有实际全局变量的代码,但在使用`-O3'编译时直接使用内联常量4