gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:02 25 4
gpt4 key购买 nike

我想知道当函数作为参数传递时,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com