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

问题描述

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

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

解决方法

带有-O3的我的GCC编译以下代码

#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具有外部链接,并且编译器将不可能证明与该翻译单元链接的某些 other 翻译单元不会在某些构造函数中修改静态变量main执行之前的函数,并且优化将被禁用。

count3const限定的。编译器知道,尽管count3具有外部链接,并且其他翻译单元可以看到相同的变量,但是其他翻译单元也无法更改其值,并且循环将被展开。