GCC与clang优化器的哪些差异导致此代码未得到优化?

GCC与clang优化器的哪些差异导致此代码未得到优化?,gcc,clang,compiler-optimization,compiler-options,boost-range,Gcc,Clang,Compiler Optimization,Compiler Options,Boost Range,如果我编译以下代码: #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) { retu

如果我编译以下代码:

#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;
}
#包括
模板
自动物联网(最后一个整数)
{
返回升压::irange(0,最后一个);
}
模板
自动物联网(最后一个整数,步长步长)
{
返回boost::irange(0,最后一步,步长);
}
int main()
{
int y=0;
用于(自动x:iota(5))
y+=x;
返回y;
}
使用clang3.9.0和gcc6.3.0在
-O1
,我通过GCC(简单地返回最终结果)和大量大量的clang输出代码获得了完整的优化。看见但是,如果我将clang切换到
-O2
,它也会编译掉所有内容


两个编译器的
-O1
模式之间的优化差异是什么导致了这种情况的发生?

-O1
基本上只是“使调试代码快速”优化级别。当您希望半优化代码的生成速度几乎与未优化代码的生成速度一样快时,可以使用它。当您真正想要优化代码时,您不会使用它。所以我真的不知道这有什么关系。据我所知,Clang前端不允许像GCC那样对优化过程进行细粒度控制(您只能使用
opt
),所以即使您了解了这些信息,我也不认为它有多大的实际用途。@CodyGray:um,
-Og
是“让我的调试代码快速”IIANM。另外,我只想知道。
-Og
在Clang中与
-O1
相同,对它的支持是最近才添加的。它在主干版本中,但我认为它在v4.0之前不会正式登陆。它不在v3.9.1中,这是我现有的最新版本。即使在GCC中,
-Og
也只是
-O1
带有一些选项,这些选项旨在简化调试,比如不剥离符号。
-O1
基本上只是“使调试代码快速”优化级别。当您希望半优化代码的生成速度几乎与未优化代码的生成速度一样快时,可以使用它。当您真正想要优化代码时,您不会使用它。所以我真的不知道这有什么关系。据我所知,Clang前端不允许像GCC那样对优化过程进行细粒度控制(您只能使用
opt
),所以即使您了解了这些信息,我也不认为它有多大的实际用途。@CodyGray:um,
-Og
是“让我的调试代码快速”IIANM。另外,我只想知道。
-Og
在Clang中与
-O1
相同,对它的支持是最近才添加的。它在主干版本中,但我认为它在v4.0之前不会正式登陆。它不在v3.9.1中,这是我现有的最新版本。即使在GCC中,
-Og
也只是
-O1
,带有一些选项,这些选项旨在简化调试,比如不剥离符号。