加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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的构造方式,因此如果编译器无法判断它是否仍未修改,则不会出现问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读