Jan*_*net 3 c++ static compiler-optimization
基于这个讨论,我想知道函数作用域静态变量是否总是使用内存,或者是否允许编译器对其进行优化.为了说明这个问题,假设一个这样的函数:
void f() {
static const int i = 3;
int j = i + 1;
printf("%d", j);
}
Run Code Online (Sandbox Code Playgroud)
编译器很可能i会3 + 1在编译时内联函数并可能进行计算.由于这是i使用值的唯一位置,因此不需要分配任何静态内存.那么编译器是允许优化静态的,还是标准要求任何静态变量都分配了内存?
那么编译器是否允许优化静态离开[...]?
是.根据标准:
本国际标准中的语义描述定义了参数化的非确定性抽象机器.本国际标准对符合实施的结构没有要求.特别是,它们不需要复制或模拟抽象机器的结构.相反,需要符合实现来模拟(仅)抽象机器的可观察行为,如下所述.5)
......脚注说:
5)这一规定有时被称为"假设"规则,因为只要结果好像符合要求,只要可以从中确定,实施就可以自由地忽视本国际标准的任何要求.程序的可观察行为.例如,实际实现不需要评估表达式的一部分,如果它可以推断出它的值没有被使用,并且没有产生影响程序的可观察行为的副作用.
这一切意味着只要可观察行为相同,编译器就可以对代码执行任何操作.由于您没有获取地址static const,编译器可以将值优化为常量积分表达式.