根据这个讨论,我想知道函数作用域静态变量是否总是使用内存,或者编译器是否允许将其优化掉。为了说明这个问题,假设有一个像下面这样的函数:
void f() {
static const int i = 3;
int j = i + 1;
printf("%d", j);
}
编译器很可能会内联
i
的值,并且可能在编译时计算3 + 1
。由于i
的值仅在此处使用,因此无需分配任何静态内存。那么编译器是否可以优化掉静态内存,或者标准是否要求分配任何静态变量的内存?根据这个讨论,我想知道函数作用域静态变量是否总是使用内存,或者编译器是否允许将其优化掉。为了说明这个问题,假设有一个像下面这样的函数:
void f() {
static const int i = 3;
int j = i + 1;
printf("%d", j);
}
i
的值,并且可能在编译时计算3 + 1
。由于i
的值仅在此处使用,因此无需分配任何静态内存。那么编译器是否可以优化掉静态内存,或者标准是否要求分配任何静态变量的内存?静态常量
的地址,所以编译器可以将其优化为常量整数表达式。不,它并不总是使用内存。我的GCC版本4.5.2在-O0
编译选项下会生成真正的全局变量代码,但在使用-O3
编译选项时会直接使用内联常量4。