【发布时间】:2019-07-19 17:38:41
【问题描述】:
我有以下两个功能基本相同:
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++ 提交错误报告还是有充分的理由?
【问题讨论】:
-
对我来说似乎错过了优化。
-
也许这取决于你调用这些函数的方式。 G++ 有一个 LTO 阶段。
-
@Ripi2 嗯,我添加了一个主函数,我调用这两个函数只是为了打印输出,并且它们都通过相同的优化被内联。
-
顺便说一句,
N = 0,中的= 0是多余的。如果不指定值,则第一个枚举器的值为 0。
标签: c++ g++ compiler-optimization