我想写一个类 A
,它有两个方法 b
和 c
。
方法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/