一个静态变量是否总是会占用内存?

4

根据这个讨论,我想知道函数作用域静态变量是否总是使用内存,或者编译器是否允许将其优化掉。为了说明这个问题,假设有一个像下面这样的函数:

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

编译器很可能会内联i的值,并且可能在编译时计算3 + 1。由于i的值仅在此处使用,因此无需分配任何静态内存。那么编译器是否可以优化掉静态内存,或者标准是否要求分配任何静态变量的内存?
3个回答

7
根据n3242中的1.8节C++对象模型,一个对象具有类型和存储期(可选名称)。除非取其地址,否则不需要内存位置。

7
所以编译器是否允许优化掉static常量?是的。根据标准:

1.9程序执行

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

......脚注说:

5) 有时这条款被称为“好像”规则,因为只要结果与从程序的可观察行为可以确定的程度上遵守了要求,实现就可以自由地忽略国际标准的任何要求。例如,如果实现可以推断出一个表达式的部分值未使用并且不会产生影响程序可观察行为的副作用,那么实际实现不需要评估该部分值。

所有这些意味着编译器可以对您的代码进行任何操作,只要可观察行为相同。因为您没有取出静态常量的地址,所以编译器可以将其优化为常量整数表达式。

0

不,它并不总是使用内存。我的GCC版本4.5.2在-O0编译选项下会生成真正的全局变量代码,但在使用-O3编译选项时会直接使用内联常量4。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接