没有虚函数的C ++继承的开销

时间:2009-08-14 18:03:09

标签: c++ inheritance virtual overhead

在C ++中,与继承没有虚函数的基类相关的开销(内存/ CPU)是什么?它是否像集体成员的直接复制+粘贴一样好?

class a
{
public:
    void get();
protected:
    int _px;
}

class b : public a
{

}

比较
class a
{
public:
    void get();
protected:
    int _px;
}

class b
{
public:
    void get();
protected:
    int _px;

}

5 个答案:

答案 0 :(得分:25)

与copy和past相比,使用继承时可能会有轻微的内存开销(由于填充),请考虑以下类定义:

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


struct B2
{
  int i;
  char c1;
  char c2;
};

sizeof(B1)可能是12,而sizeof(B2)可能只是8.这是因为基类A分别填充到8个字节,然后B1再次填充到12个字节。

答案 1 :(得分:14)

编译需要稍长的时间,并且不会有额外的运行时开销。从优化器的角度来看,非虚方法与过程相同 - 只能使用它们的内存地址调用它们,而不会产生虚拟方法表的开销。

答案 2 :(得分:3)

如果您忘记了虚拟继承,那么拥有一个基类与内容和性能相当,就是拥有相同类的成员。例外情况它有时甚至更好(例如,一个空类的大小至少为一,但是有一个空基类可能通常没有开销)。

答案 3 :(得分:2)

如果你有一个Base *类型的指针指向Derived *类型的对象,你可能需要一个虚拟析构函数,你的原始前提不再适用。如果派生类有一个空的析构函数,并且它没有成员或者它们都是POD类型,那么你可以在没有虚拟析构函数的情况下离开,但通常最好安全地发挥它并从一开始就使它成为虚拟。

编译器将生成对实现每个非虚拟成员函数的代码的直接调用,因此没有开销。

答案 4 :(得分:1)

不是,它只增加了基类的内存。您可以在C ++ FAQ

中的here中阅读更多内容