从多态基指针调用基类方法很慢

时间:2016-09-23 03:54:41

标签: c++ class oop c++11 polymorphism

标题非常令人困惑..这是一个总结最小代码 -

#include <iostream>
#include <chrono>
#include <memory>

using namespace std;
using namespace std::chrono;

enum class TYPE {base, child};

class Base {
    int n;
  protected: Base(int _n) : n(_n) {}
  public: virtual TYPE getType(){ return TYPE::base; }
};

class Child: public Base {
    int m;
  public:
    TYPE getType(){ return TYPE::child; }
    Child(int _n, int _m) : Base(_n), m(_m) {}
};

int main() {
    unique_ptr<Base> b = make_unique<Child>(6, 7);
    TYPE tB = TYPE::base;
    TYPE tC = TYPE::child;

    {
        auto t1 = high_resolution_clock::now();

        std::cout << (tB == b->Base::getType()) << ", ";

        auto t2 = high_resolution_clock::now();
        auto duration = duration_cast<microseconds>( t2 - t1 ).count();
        cout << "Duration: " << duration << std::endl;

    }

    {
        auto t1 = high_resolution_clock::now();

        std::cout << (tC == b->getType()) << ", ";

        auto t2 = high_resolution_clock::now();
        auto duration = duration_cast<microseconds>( t2 - t1 ).count();
        cout << "Duration: " << duration << std::endl;

    }

    return 0;
}

输出如下 -

1, Duration: 12  // first run was 62
1, Duration: 0

我理解虚拟函数与普通(compileTime-resolved)函数相比可能会慢得多,但是上面的函数 - b->Base::getType()如何比虚函数慢{ - 1}}?这是两次旅行,比如几乎解决了这个功能,然后再回到基类?谁能帮我理解这个?

IDEONE

嗯,稍微修改代码以包含循环,结果很清楚 - 的 IDEONE

b->getType()

1 个答案:

答案 0 :(得分:3)

一个函数调用的时间数字被调用cout所用的时间所淹没。最初的cout调用可能为缓冲区分配内存,并且需要更长的时间。

第一个电话(b->Base::getType())不是虚拟的,甚至可以内联。