c++ - 具有多次调用的可替换方法的类

标签 c++ performance function oop polymorphism

我想写一个类 A,它有两个方法 bc。 方法b 调用c。 我希望能够用我喜欢的任何东西替换 c

我认为,如果我将 c 设为函数指针或虚方法,我可以做到这一点。

但是,b 会被多次调用。这两种方案会影响性能吗?

是否可以重新设计它以避免使用函数指针/虚拟方法?

测试继承:

#include <iostream>
class A { 
public:
    A() {}
    void b() { c(); }
    void c() { std::cout << "1\n"; }
};

class B : public A { 
public:
    void c() { std::cout << "2\n"; }
};

int main() {
    B b;
    b.b();
}

结果:

1

不是 2。

编辑:我想指定 c 在编译时做什么。我想将多种形式的 c 插入到同一个 b 方法中。

最佳答案

虚函数和函数指针都有同样的性能问题。

首先,编译器通常无法内联这些调用。通常编译器必须进行真正的函数调用并承担副作用,因此无法执行许多优化技术。通常影响是非常显着的。

其次,在代码执行期间,CPU 通常无法通过指针调用预取代码 - 因为它不知道执行将转移到何处。然而,硬件调用去虚拟化器,类似于分支预测器,尝试根据过去的性能推测性地预取指令,并且在几次调用之后它们被训练并且在那里做得很好。然而,缺乏内联仍然困扰着你。

关于c++ - 具有多次调用的可替换方法的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759994/

相关文章:

java - Grails 应用程序速度非常慢

c# - 来自 Siteminder 的 Visual Studio 负载测试重定向 URL

C++ 随机整型函数

在函数中作为结构体传递并返回后创建 C 库

c++ - 删除行后如何重新索引或修复rowid?sqlite?

c++ - 使用 dbx 在 AIX 上捕获 C++ 异常

c++ - 返回多维数组 C++

c++ - 使用工厂填充元组并避免复制

c# - DataAdapter.Update() 性能

function - 将 varargin 解包为单个变量