在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;
}
答案 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中阅读更多内容