c++ - 在不产生动态查找成本的情况下拥有通用代码接口(interface)的好方法是什么?

标签 c++ polymorphism function-pointers

我正在编写一些处理数据的代码。有许多组处理函数可供用户选择,然后应用于数据集。我想在不同的地方实现所有这些组,但由于它们都采用相同的参数并且都做类似的事情,我希望它们有一个通用的接口(interface)。

作为一名出色的 C++ 小程序员,我的第一个想法是简单地使用多态性。只需创建一些具有所需接口(interface)的抽象类,然后从中派生出每组处理对象。然而,当我想到另一个皱纹时,我的希望很快就破灭了。这些数据集非常庞大,导致相关函数被调用了数十亿次。虽然动态查找相当便宜,但据我所知,它比标准函数调用慢很多。

我目前的想法是使用函数指针,以类似这样的方式:

void dataProcessFunc1(mpz_class &input){...}
void dataProcessFunc2(mpz_class &input){...}
...
class DataProcessInterface
{
    ...
    void (*func1)(mpz_class);
    void (*func2)(mpz_class);
    ...
}

使用某种构造函数或其他东西来设置指针以指向正确的东西。

所以我想我的问题是:这是一个好方法吗?还有别的办法吗?还是我应该学会停止担心并热爱动态查找?

最佳答案

虚函数调用通过指针的函数调用。开销通常与通过指针的显式函数调用大致相同。换句话说,您的想法可能收获很少(很可能什么都没有)。

我的直接 react 是从虚函数开始,只有当/如果分析器显示虚调用的开销变得显着时才担心其他事情。

当/如果发生这种情况,另一种可能性是在类模板中定义接口(interface),然后将该接口(interface)的各种实现放入模板的特化中。这通常会消除所有运行时开销(尽管这通常是相当多的额外工作)。

关于c++ - 在不产生动态查找成本的情况下拥有通用代码接口(interface)的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218798/

相关文章:

C++ OpenGL 绘制一个房间

java - 为什么多态性不适用于 Java 中的重载方法?

Java 多态性 : How can I avoid type casting input parameters?

c++ - C++中堆类的多态性

c++ - 模板类中 boost::unordered_map 中的 boost::tuple 出现问题

c++ - 维护对象的有序集合

c++ - VisualAssist 找不到 boost::bind 的声明

c++ - 将 boost 日期初始化为公元元年

java - 覆盖具有不同签名的方法

c++ - 如何从 C++ 中的静态函数内部将指向静态函数的指针作为参数传递给另一个静态函数