c – 我可以坚持GCC通过存储的函数指针内联延迟调用吗?
发布时间:2020-12-16 09:56:46 所属栏目:百科 来源:网络整理
导读:当然,当在该范围内直接知道内部函数调用时,C编译器可以内联函数模板中的函数调用( ref). #include iostreamvoid holyheck(){ std::cout "!n";}template typename Fvoid bar(F foo){ foo();}int main(){ bar(holyheck);} 现在如果我将holyheck传递给一个类,
当然,当在该范围内直接知道内部函数调用时,C编译器可以内联函数模板中的函数调用(
ref).
#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有lambdas,但你标记了你的问题C 03.) 通过在这些类中使用不同的Foo实例,并且在这些类中没有内部状态,f()不依赖于f的构造方式,因此如果编译器无法判断它是否仍未修改,则不会出现问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |