如果用-Os而不是-O2编译,那么g ++选项会阻止内联lambda函数

时间:2017-11-17 11:06:29

标签: c++ lambda g++ compiler-optimization avr-gcc

这里是编译时重复lambda的简单代码。我使用-Os-O2为AVR编译。使用-Os时,lambda不是内联的,而是-O2。 g ++手册说-Os-O2相同,但禁用了一些增加代码大小的优化。我想知道我是否可以调整g ++选项来内联这样简单的lambda。

#include <cstdint>
#include <utility>

volatile uint8_t x;

namespace detail {
    template<auto... II, typename F>
    void repeat_impl(std::index_sequence<II...>, F&& f) {
        ( ((void)II, f()) , ...);
    }
}

template<auto N, typename F>
void repeat(F&& f) {
    detail::repeat_impl(std::make_index_sequence<N>{}, static_cast<F&&>(f));
}

int main() {
    repeat<10>([](){
        x/=2;
    });
}

1 个答案:

答案 0 :(得分:0)

这三个似乎与内联有关,在-O2开启但不是-Os:

-finline-small-functions 
-findirect-inlining 
-fpartial-inlining 

您可以逐个添加到-Os。虽然内联可能发生在编译的早期阶段。优化,在应用内联之前的另一个优化之后,可能存在函数变得可行的内联。

我认为always_inline属性不符合C ++标准。 (但不确定)如果不是,则取决于编译器。 Gcc似乎支持该属性。将该属性添加到该函数将导致内联函数。