这里是编译时重复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;
});
}
答案 0 :(得分:0)
这三个似乎与内联有关,在-O2开启但不是-Os:
-finline-small-functions
-findirect-inlining
-fpartial-inlining
您可以逐个添加到-Os。虽然内联可能发生在编译的早期阶段。优化,在应用内联之前的另一个优化之后,可能存在函数变得可行的内联。
我认为always_inline属性不符合C ++标准。 (但不确定)如果不是,则取决于编译器。 Gcc似乎支持该属性。将该属性添加到该函数将导致内联函数。