在下面的代码片段中,两个函数执行完全相同的功能并且在逻辑上是等效的。
在gcc的
这种优化看起来很简单,但我无法让MSVC(自动)进行优化。 我在这里错过了什么?
constexpr char a[] = {50, 100};
bool contains_loop(char num) {
for (int i = 0; i < 2; ++ i) {
if (a[i] == num) {
return true;
}
}
return false;
}
bool contains_expanded(char num) {
return num == a[0] || num == a[1];
}
我的测试在godbolt上显示,在启用了/O2
之后,x64 MSVC 19.30中的contains_loop
未被优化为展开循环。在汇编代码中仍然有计数器,而contains_expanded
的编译汇编代码中没有计数器。
inc rax
cmp rax, 2
在gcc的
-O3
优化下,它们被编译成完全相同的汇编代码。这种优化看起来很简单,但我无法让MSVC(自动)进行优化。 我在这里错过了什么?