gpt4 book ai didi

c++ - 为什么 g++ 不优化局部数组而是优化全局数组?

转载 作者:行者123 更新时间:2023-11-30 02:14:51 24 4
gpt4 key购买 nike

我有以下两个功能基本相同:

enum Direction{
N = 0,
NW,
W,
SW,
S,
SE,
E,
NE,
TOTAL_DIRS
};

char const * const strings[] = {"N", "NW", "W", "SW", "S", "SE", "E", "NE"};

char const *
getDirString2(unsigned dir) {
if (TOTAL_DIRS > dir)
return strings[dir];
return nullptr;
}

char const *
getDirString3(unsigned dir) {
char const * const strings[] = {"N", "NW", "W", "SW", "S", "SE", "E", "NE"};
if (TOTAL_DIRS > dir)
return strings[dir];
return nullptr;
}

但是 g++ 优化了使用全局数组的函数,就像我期望的那样。它为替代方案创建了更多复杂的代码。 Clang 为两者创建相同的代码,如果我改用 switch 语句,clang 和 c++ 也会为 getDirString2 创建相同的代码。

这里是编译器资源管理器的链接 https://godbolt.org/z/GxvrTv

这是我应该为 g++ 提交错误报告的东西还是有充分的理由?

最佳答案

我想你可以称之为优化遗漏,尽管这对 gcc 人员来说有点苛刻。

gcc 在编译 getDirString3 时,完全按照您的要求执行 - 在堆栈上构造一个字符串数组,然后只返回其中的一个元素。

另一方面,clang 看到这个数组永远不会改变,而是在静态存储中构造它,参见:https://godbolt.org/z/24n-N7

要使 gcc 像 clang 一样生成代码,请将 getDirString3 中的数组声明为 static(这本来是个好主意),请参阅:https://godbolt.org/z/henD2Z

关于c++ - 为什么 g++ 不优化局部数组而是优化全局数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57117306/

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