如果我编译以下代码:
#include <boost/range/irange.hpp>
template<class Integer>
auto iota(Integer last)
{
return boost::irange(0, last);
}
template<class Integer, class StepSize>
auto iota(Integer last, StepSize step_size)
{
return boost::irange(0, last, step_size);
}
int main( )
{
int y = 0;
for (auto x : iota(5))
y += x;
return y;
}
在-O1
的clang 3.9.0和GCC 6.3.0中,我通过GCC完成优化(只返回最终结果)和大量的clang输出代码。见this experiment on GodBolt。但是,如果我将clang切换到-O2
,它也可以编译所有内容。
两个编译器之间的优化差异是什么? -O1
模式导致这种情况发生?