基于this讨论,我想知道函数作用域静态变量是否总是使用内存,或者是否允许编译器对其进行优化。为了说明这个问题,假设一个类似的函数:
void f() {
static const int i = 3;
int j = i + 1;
printf("%d", j);
}
编译器很可能内联i
的值,并且可能在编译时进行计算3 + 1
。由于这是唯一使用i
值的地方,因此不需要分配任何静态内存。那么编译器是允许优化静态的,还是标准要求任何静态变量都分配了内存?
答案 0 :(得分:6)
根据1.8 The C++ object model
n3242部分
对象具有类型和存储持续时间(可选择名称) 除非获取地址,否则它不需要内存位置。
答案 1 :(得分:6)
允许编译器优化静态离开[...]?
是。根据标准:
本国际标准中的语义描述定义了一个 参数化非确定性抽象机。这个国际 标准对符合结构没有要求 实现。特别是,他们不需要复制或模仿 抽象机器的结构。相反,符合实施 需要模仿(仅)抽象的可观察行为 机器如下所述.5)
......脚注说:
5)这项规定有时被称为“as-if”规则,因为a 实施可以自由地忽视任何要求 国际标准只要结果就好像要求一样 从可观察的角度来看,已经服从了 该计划的行为。例如,实际的实施需要 如果它可以推导出它的值,则不评估表达式的一部分 未使用,没有影响可观察行为的副作用 制作该节目。
这一切意味着只要可观察行为相同,编译器就可以对代码执行任何操作。由于您没有获取static const
的地址,编译器可以将值优化为常量积分表达式。
答案 2 :(得分:0)
不,它不会总是使用内存。我的GCC版本4.5.2在-O0
上生成具有实际全局变量的代码,但在使用`-O3'编译时直接使用内联常量4