代码之家  ›  专栏  ›  技术社区  ›  Theo d'Or

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

  •  0
  • Theo d'Or  · 技术社区  · 4 年前

    我在这个问题上的搜索结果是空白的。。。关于如何 const 通过发出变量的只读访问信号,可能有助于编译器优化,但我找不到标题中提出的问题的答案。我对这个问题很感兴趣,因为我想避免考虑使用 const 如果编译器无论如何都能做到这一点,则可以进行优化。

    我很感激,即使编译器能够找到不变的值并将其优化为只读访问,也会有使用 const 仍然会有帮助。我只是想从广义上寻找编译器能力的答案——GCC优化器是否在不使用 const ?

    1 回复  |  直到 4 年前
        1
  •  5
  •   Antti Haapala -- Слава Україні    4 年前

    我的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 具有外部链接并且相同的变量对其他翻译单元可见。

    推荐文章