【发布时间】:2021-08-28 17:06:53
【问题描述】:
以下代码:
#include <vector>
extern std::vector<int> rng;
int main()
{
auto is_even=[](int x){return x%2==0;};
int res=0;
for(int x:rng){
if(is_even(x))res+=x;
}
return res;
}
由 GCC 11.1 (link to Godbolt) 以非常不同的方式优化:
#include <vector>
extern std::vector<int> rng;
int main()
{
int res=0;
for(int x:rng){
if(x%2==0)res+=x;
}
return res;
}
(Link to Godbolt.) 此外,第二个版本(其中 lambda 已被直接手动注入其主体代替调用位置)比第一个版本快得多。
这是 GCC 错误吗?
【问题讨论】:
-
查看生成的程序集,带有 lambda 的版本没有自动矢量化,因此更快的第二个版本很有意义。
-
这是直接在 Godbolt 中并排的,顺便说一句:godbolt.org/z/aYq5Gx3P8
-
是的,但为什么 GCC 不使用 lambda 向量化?
-
Clang 似乎对两个版本都进行了矢量化,请参阅:godbolt.org/z/Txb4scMo4
标签: c++ gcc optimization lambda