C 优化编译器 (GCC) 是否能够在不使用 'const' 的情况下检测 read-only 访问的不变值?
Are C optimizing compilers (GCC) able to detect unchanging values for read-only access without the use of 'const'?
我在这个问题上的搜索结果是空白...关于 const
如何通过发出 read-only 变量访问信号来帮助编译器优化的讨论很多,但我可以找不到标题中提出的问题的答案。我对这个问题很感兴趣,因为我想避免考虑使用 const
进行优化,如果编译器无论如何都可以这样做的话。
我很欣赏即使编译器能够找到不变的值并将它们优化为 read-only 访问,在某些情况下使用 const
仍然会有帮助。我只是在广义上寻找有关编译器功能的答案 - GCC 优化器是否在不使用 const
的情况下寻找不变的值?
我的 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
,第一个循环也展开了,因为它有 内部 linkage.
count2
有外部 linkage,编译器不可能证明你 other 翻译单元 link 使用此翻译单元不会在执行 main
之前修改某些构造函数中的静态变量,并且优化将被禁用。
count3
是 const
合格的。编译器知道没有其他翻译单元也可以更改它的值并且循环将展开,尽管 count3
具有外部 linkage,并且相同的变量对其他翻译单元可见。
我在这个问题上的搜索结果是空白...关于 const
如何通过发出 read-only 变量访问信号来帮助编译器优化的讨论很多,但我可以找不到标题中提出的问题的答案。我对这个问题很感兴趣,因为我想避免考虑使用 const
进行优化,如果编译器无论如何都可以这样做的话。
我很欣赏即使编译器能够找到不变的值并将它们优化为 read-only 访问,在某些情况下使用 const
仍然会有帮助。我只是在广义上寻找有关编译器功能的答案 - GCC 优化器是否在不使用 const
的情况下寻找不变的值?
我的 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
,第一个循环也展开了,因为它有 内部 linkage.
count2
有外部 linkage,编译器不可能证明你 other 翻译单元 link 使用此翻译单元不会在执行 main
之前修改某些构造函数中的静态变量,并且优化将被禁用。
count3
是 const
合格的。编译器知道没有其他翻译单元也可以更改它的值并且循环将展开,尽管 count3
具有外部 linkage,并且相同的变量对其他翻译单元可见。