gpt4 book ai didi

c++ - 我可以说服 GCC 通过存储的函数指针内联延迟调用吗?

转载 作者:太空狗 更新时间:2023-10-29 20:12:12 26 4
gpt4 key购买 nike

自然地,当内部函数调用在该作用域 (ref) 中直接已知时,C++ 编译器可以内联从函数模板内进行的函数调用。

#include <iostream>

void holyheck()
{
std::cout << "!\n";
}

template <typename F>
void bar(F foo)
{
foo();
}

int main()
{
bar(holyheck);
}

现在,如果我将 holyheck 传递给一个存储函数指针(或等效指针)并稍后调用它的类会怎样?我有希望得到这个内联吗?怎么办?

template <typename F>
struct Foo
{
Foo(F f) : f(f) {};
void calledLater() { f(); }

private:
F f;
};

void sendMonkeys();
void sendTissues();

int main()
{
Foo<void(*)()> f(sendMonkeys);
Foo<void(*)()> g(sendTissues);
// lots of interaction with f and g, not shown here
f.calledLater();
g.calledLater();
}

我的类型 Foo 旨在隔离大量逻辑;它将被实例化几次。从 calledLater 调用的特定函数是实例化之间唯一不同的东西(尽管它在 Foo 的生命周期内永远不会改变),所以 的一半目的Foo 就是遵守DRY。 (它的其余目的是使该机制与其他代码隔离。)

但我不想在这样做时引入实际额外函数调用的开销,因为这一切都发生在程序瓶颈中。

我不会说 ASM,所以分析编译后的代码对我来说用处不大。
我的直觉是我没有机会在这里内联。

最佳答案

如果您真的不需要使用函数指针,那么仿函数应该使优化变得微不足道:

struct CallSendMonkeys {
void operator()() {
sendMonkeys();
}
};
struct CallSendTissues {
void operator()() {
sendTissues();
}
};

(当然,C++11 有 lambda,但您将问题标记为 C++03。)

通过对这些类进行不同的 Foo 实例化,并且在这些类中没有内部状态,f() 不依赖于 f code> 已被构造,因此如果编译器无法判断它是否保持未修改,这不是问题。

关于c++ - 我可以说服 GCC 通过存储的函数指针内联延迟调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28820978/

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