gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:37:39 25 4
gpt4 key购买 nike

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

我很欣赏,即使编译器能够找到不变的值并将它们优化为只读访问,在某些情况下使用 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,第一个循环也已展开,因为它具有内部链接

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

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

关于c - C 优化编译器 (GCC) 是否能够在不使用 'const' 的情况下检测只读访问的不变值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64080013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com