C ++编译时延续内联

时间:2018-06-07 23:02:30

标签: c++

我正在尝试内联以下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。

1 个答案:

答案 0 :(得分:2)

Clang非常好地优化了它。使用std::function<>只会产生与类型擦除相关的小开销:

延续风格:https://godbolt.org/g/FxHSnV

直接式:https://godbolt.org/g/N1b8QC

我使用dummy_write()来避免使用iostreamstd::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);
}