我的GCC使用-O3编译了以下代码
#include <stdio.h>
static int count1 = 3;
int count2 = 3;
const int count3 = 3;
int main(void) {
for (int i = 0; i < count; i++) {
printf("Hello world\n");
}
for (int i = 0; i < count2; i++) {
printf("Hello again\n");
}
for (int i = 0; i < count3; i++) {
printf("Hello once more\n");
}
}
相当于
#include <stdio.h>
int count2 = 3;
const int count3 = 3;
int main(void) {
puts("Hello world");
puts("Hello world");
puts("Hello world");
for (int i = 0; i < count2; i++) {
puts("Hello again");
}
puts("Hello once more");
puts("Hello once more");
puts("Hello once more");
}
显然,即使没有
const
-合格
count1
,因为它有
内部联系
.
count2
具有外部链接,编译器不可能证明某些
其他
与此转换单元链接的转换单元在之前不会修改某些构造函数中的静态变量
main
已执行,优化将被禁用。
count3
是
const
-合格。编译器知道没有其他翻译单元可以更改其值,并且循环将被展开,尽管
计数3
具有外部链接并且相同的变量对其他翻译单元可见。