C 优化编译器 (GCC) 是否能够在不使用“const”的情况下检测只读访问的不变值?

The*_*'Or 2 c compiler-optimization readonly-variable

我的搜索在这个问题上变成了空白......有很多关于如何const通过发出变量的只读访问信号来帮助编译器优化的讨论,但我无法找到问题的答案标题。我对这个问题很感兴趣,因为const如果编译器可以这样做,我想避免考虑使用优化。

我很欣赏即使编译器能够找到不变的值并将它们优化为只读访问,在某些情况下,使用const仍然会有所帮助。我只是在广泛地寻找有关编译器功能的答案 - GCC 优化器是否在不使用 的情况下寻找不变的值const

Ant*_*ala 5

我的 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

相当于

#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");
}
Run Code Online (Sandbox Code Playgroud)

显然,即使没有const限定count1,第一个循环也已展开,因为它具有内部链接

count2具有外部链接,编译器将无法证明您与该翻译单元链接的其他翻译单元在main执行之前不会修改某些构造函数中的静态变量,并且优化将被禁用。

count3const-合格的。编译器知道没有其他翻译单元可以改变它的值,循环将被展开,尽管count3有外部链接,并且相同的变量对其他翻译单元可见。