Какие различия между оптимизатором GCC и clang приводят к тому, что этот код не оптимизируется?

Если я скомпилирую следующий код:

#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;
}

С лязгом 3.9.0 и GCC 6.3.0 на -O1Я получаю полную оптимизацию по GCC (просто возвращает конечный результат) и много-много Clang выходного кода. Смотрите этот эксперимент на GodBolt. Если я переключу Clang на -O2Однако, это также компилирует все.

Какие различия в оптимизации между двумя компиляторами? -O1 режимы это вызывает?

0 ответов

Другие вопросы по тегам