c++ - 虚拟功能和性能
问题描述
假设我有以下课程:
class A
{
public:
virtual int f(int a, int b)
{
return a+b;
}
virtual ~A()
{}
};
class B : public A
{
public:
virtual int f(int a, int b) override
{
return a+b;
}
};
我们来看看以下函数的基准测试结果:
static void A_PTR_TO_B_TEST(benchmark::State& state) {
A* obj = new B;
for (auto _ : state) {
obj->f(5, 6);
}
delete obj;
}
BENCHMARK(A_PTR_TO_B_TEST);
static void A_PTR_TO_A_TEST(benchmark::State& state) {
A* obj = new A;
for (auto _ : state) {
obj->f(5, 6);
}
delete obj;
}
BENCHMARK(A_PTR_TO_A_TEST);
static void B_PTR_TO_B_TEST(benchmark::State& state) {
B* obj = new B;
for (auto _ : state) {
obj->f(5, 6);
}
delete obj;
}
BENCHMARK(B_PTR_TO_B_TEST);
我的第一个问题是:为什么 A_PTR_TO_B_TEST 和 A_PTR_TO_A_TEST 之间有这么大的区别?
GCC10.3 -std=c++2a -O3 对所有三个测试给出相同的结果。
我已经多次运行此测试,A_PTR_TO_A_TEST 总是比 A_PTR_TO_B_TEST 花费稍长的时间。所以我的第二个问题是了解为什么 A_PTR_TO_B_TEST 和 A_PTR_TO_A_TEST 之间存在差异。
解决方案
推荐阅读
- arrays - 在c中使用通用快速排序对char**数组进行排序
- css - 为单选按钮文本提供 nowrap
- c++ - 如何直接访问 QTableView 中的 QWidget?
- sql - 将分隔字符串拆分为多列和多行
- javascript - 在 js 中使用或条件的更好方法
- python - 根据两列比较和排列数据框中的行?
- java - 使用Java中的字符串库,给定字符串中子字符串的最大连续重复次数
- java - 如何在java中的字符串数组之间添加逗号/和
- json - 使用别名/别名路径时,Webpack 无法导入 .json 文件
- python - response['Items'] 返回一个空列表是否有原因?我能够打印测试功能的事件参数