我正在尝试内联以下C ++代码:
__attribute__((always_inline)) static void inline compose(const char* s, std::function<void(const char *)> f) {
std::cout << s << std::endl;
f(s);
}
// --------------- Main ---------------
int main() {
// Nest three things
compose("hello world", [](const char *s) {
compose("hello again", [](const char *s) {
compose("hello third time", [](const char *s) {
return;
});
});
});
return 0;
}
此处我的延续类型为std::function<void(const char*)>
,我希望编译器使用always_inline
选项将其转换为单个调用站点,如下所示:
// --------------- Main ---------------
int main() {
// Nest three things
std::cout << "hello world" << std::endl;
std::cout << "hello again" << std::endl;
std::cout << "hello third time" << std::endl;
return 0;
}
是否可以在编译时执行此操作?我认为编译器不能自动执行此操作,但我认为预处理器可以使用constexpr和C ++ 17。
答案 0 :(得分:2)
Clang非常好地优化了它。使用std::function<>
只会产生与类型擦除相关的小开销:
延续风格:https://godbolt.org/g/FxHSnV
直接式:https://godbolt.org/g/N1b8QC
我使用dummy_write()
来避免使用iostream
和std::cout
生成的外观复杂的程序集。
可以通过模板compose
而不是使用std::function
来消除此类型的删除:https://godbolt.org/g/7QceN6
template<typename Func>
__attribute__((always_inline))
static void inline compose(const char* s, Func f) {
dummy_write(s);
f(s);
}