(C++) C++虚函数性能分析

class baseA {
public:
    virtual float mulTwo(float a, float b) = 0;
    virtual ~baseA() = default;
};

class vClassA : public baseA {
public:
  ~vClassA() override = default;
  float mulTwo(float a, float b) override {
    return a * b;
  }
};

class ClassB {
public:
  float mulTwo(float a, float b) {
    return a * b;
  }
};

int main() {
    volatile double sum{};
    baseA* obja = new vClassA();
    sum += obja->mulTwo(1.1, 2.2);

    ClassB objb;
    sum += objb.mulTwo(1.1, 2.2);
    return 0;
}

汇编分析见 Compiler Explore

虚函数调用过程:

  1. 从对象中获取虚表指针,该指针指向一个函数指针数组,每个指针对应一个虚函数;
  2. 从虚表中获取正确的函数地址,放到寄存器中;
  3. 跳转到该寄存器中的地址,而不是跳转到一个硬编码的地址。

性能降低的原因:

  1. 由于需要间接寻址,会存在分支预测问题,由此导致可能的失败时清空流水线及重新从内存加载指令的耗时;
  2. 虚函数不能进行函数级别的优化,如内联以及其他的优化,导致可能的性能损失(有可能丧失的优化(猜测):RVO优化,jump优化)。
posted @ 2022-10-17 22:45  山岚2013  阅读(193)  评论(0编辑  收藏  举报