函数指针返回具有局部性的 C++ 中的另一个函数指针

Posted

技术标签:

【中文标题】函数指针返回具有局部性的 C++ 中的另一个函数指针【英文标题】:function pointer returning another function pointer in C++ with locality 【发布时间】:2013-11-21 07:50:18 【问题描述】:

考虑到一个指向一个函数的指针返回另一个指向另一个函数的指针是 C 中用来引入一些运行时多态/回调的机制,在 C++ 中实现这一点的等效方法是什么,同时提高了局部性并降低了成本指针和间接?

例如this syntactic sugar 可以提供帮助,但我对此并不感兴趣,尽管这是一种以 C++ 方式而不是更 C 风格的 typedef 做事的好方法,但我更感兴趣的是改进局部性,同时尝试减少运行时显式指针的使用。

【问题讨论】:

你想做什么?向我们展示这样做的旧方法(代码)。我们无法根据猜测来改进事情。 @user694733 我没有添加任何具体示例,因为这会使讨论两极分化,我不希望其他用户提供任何代码,这个问题更多的是关于设计和性能而不是实际代码。 性能始终与特定应用程序相关联。没有通用指南:“做 X,它总是会更快”。对于您的问题,虚拟功能似乎是可行的方法。根据我的经验,它们提供的灵活性始终比可忽略的性能成本更重要。如果你想改进分支预测之类的东西,你需要首先展示确切的问题,因为答案将取决于它。 【参考方案1】:

人们在 C 中使用函数指针来模拟多态的真正原因不是性能,而是 C 既不支持真正的多态也不支持模板这一事实。这是您在 C++ 中的两种选择。所有三种方法都在this thread 中进行了比较。

请注意,即使调用函数指针不需要虚函数调用所做的额外 vtable 查找,调用虚函数和函数指针都会遇到相同的主要性能问题:两种情况下的分支预测都不可靠,并且您往往会导致更多的管道刷新。

【讨论】:

这就是我正在尝试做的事情,我正在尝试帮助 CPU 处理局部性。 正如the linked thread 中所指出的,使用模板可以获得最佳性能。但在大多数情况下,不值得由此产生的缺点。使用模板最糟糕的是cryptic compiler errors。【参考方案2】:

我认为你可以使用虚函数来满足部分要求。

【讨论】:

我想避免这种情况,原则上,我也想通过设计来避免一般的虚函数。

以上是关于函数指针返回具有局部性的 C++ 中的另一个函数指针的主要内容,如果未能解决你的问题,请参考以下文章

c++中函数中变量内存分配以及返回指针引用类型的思考

C++中的指针和向量

C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?

C++ lambda表达式(函数指针和function)

c++中函数的内存注意项

C|指针的10种经典应用场合