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

jam*_*o00 19 c++ virtual inheritance overhead

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

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

class b : public a
{

}
Run Code Online (Sandbox Code Playgroud)

和....相比

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

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

}
Run Code Online (Sandbox Code Playgroud)

cme*_*erw 27

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

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


struct B2
{
  int i;
  char c1;
  char c2;
};
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*kin 15

编译需要花费更长的时间,并且不会有额外的运行时开销.从优化器的角度来看,非虚方法与过程相同 - 只需使用其内存地址即可调用它们,而无需虚拟方法表的开销.

  • 增加的时间只有几毫秒,因为编译器必须构造继承树.这不值得关心. (7认同)