c++ - 将内联函数作为参数传递

标签 c++ c++11

我想知道当函数作为参数传递时,C++ 是否仍会遵守 inline 关键字。在下面的示例中,每次在 while 循环中调用 frame() 时,是否会将 onFrame 的新帧压入堆栈?

bool interrupt = false;

void run(std::function<void()> frame) {
    while(!interrupt) frame();
}

inline void onFrame() {
    // do something each frame
}

int main() {
    run(onFrame);
}

或者改成这个会有什么影响吗?

void run(std::function<inline void()> frame) {
    while(!interrupt) frame();
}

如果你没有明确的答案,你能帮我想办法测试一下吗?可能使用内存地址或某种调试器?

最佳答案

如果编译器必须通过 std::function 来内联您的函数,那么编译器将非常困难。的类型删除 dispatch 到达那里。无论如何它都有可能发生,但你正在让它变得尽可能困难。您提出的替代方案(采用 std::function<inline void()> 参数)格式错误。

如果不需要类型删除,请不要使用类型删除。 run()可以简单地接受一个任意的可调用对象:

template <class F>
void run(F frame) {
    while(!interrupt) frame();
}

很多更容易为编译器内联。虽然,只是有一个 inline函数本身并不能保证函数被内联。参见 this answer .

另请注意,当您传递函数指针时,它也不太可能被内联,这很尴尬。我试图在这里找到一个有很好示例的答案,但在那之前,如果内联非常重要,那么将它包装在 lambda 中可能是可行的方法:

run([]{ onFrame(); });

关于c++ - 将内联函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290068/

相关文章:

c++ - 为什么不应该将 auto&& 用于局部变量?

c++ - float 的全局格式化选项

c++ - 使用此指针会导致热循环中出现奇怪的反优化

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - SourceLink:PDB 文件名大小写与存储库不匹配,破坏 SourceLink

c++ - 在将 void* 转换为任何内容时,我应该使用 static_cast 还是 reinterpret_cast

c++ - Ref 限定的成员函数设计打破了 const 右值

c++ - 在 C++ 中使用 auto 声明 lambda 变量的首选方法是什么?

c++ - 在 C++ 中索引离开数组边界后发生段错误

c++ - 将应用程序转换为使用 dll。类 'std::map<_Kty,_Ty>' 需要有 dll 接口(interface)才能被类的客户端使用