C+的开销+;没有虚函数的继承 在C++中,继承基类的开销(内存/ CPU)是什么,没有一个虚拟函数?它和直接复制+粘贴类成员一样好吗 class a { public: void get(); protected: int _px; } class b : public a { }

C+的开销+;没有虚函数的继承 在C++中,继承基类的开销(内存/ CPU)是什么,没有一个虚拟函数?它和直接复制+粘贴类成员一样好吗 class a { public: void get(); protected: int _px; } class b : public a { },c++,inheritance,virtual,overhead,C++,Inheritance,Virtual,Overhead,相比 class a { public: void get(); protected: int _px; } class b { public: void get(); protected: int _px; } 不是真的,它只是增加了基类的内存。在C++中,你可以阅读更多的FAQ < P>编译,它会花费很长的时间,并且不会有额外的运行时开销。从优化器的角度来看,非虚拟方法与过程是一样的——它们可以仅使用内存地址调用,而不会从虚拟方法表中产生开销。如果您忘

相比

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

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

}

不是真的,它只是增加了基类的内存。在C++中,你可以阅读更多的FAQ

< P>编译,它会花费很长的时间,并且不会有额外的运行时开销。从优化器的角度来看,非虚拟方法与过程是一样的——它们可以仅使用内存地址调用,而不会从虚拟方法表中产生开销。

如果您忘记了虚拟继承,那么拥有基类在内存和性能方面等同于拥有同一类的成员。除非它有时甚至更好(例如,一个空类的大小至少为一个,但有一个空基类可能通常没有开销)。

如果您可能有一个base*类型的指针指向派生*类型的对象,那么您可能需要一个虚拟析构函数,并且您的原始前提不再适用。如果派生类有一个空的析构函数,并且它没有成员,或者它们都是POD类型,那么您可以不使用虚拟析构函数,但通常最好安全起见,从一开始就将其虚拟化


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

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

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字节。

如果没有虚拟函数,使用(公共)继承有什么意义?您至少需要一个虚拟析构函数。@Neil可以用于代码重用,避免重新发明轮子。在这种情况下,他应该使用组合、私有继承或自由函数。@Neil:我相信流没有虚拟函数,但它们彼此派生。这有什么不对?我读过,我不相信。在C++中,虽然我将派生函数和虚拟函数与编译时多态性结合在一起,但目前大多数都不做实际的OO。我更喜欢多范式的人。不管怎样,我记得GCC警告说,对于从未更新过的类,虚拟DTR会丢失,更不用说通过基类指针删除了。有个家伙将代码移植到Linux,每次GCC这么说时,他都会无意识地放入虚拟DTR,有时会将vtable添加到纯编译时构造的零大小类中。这让我发疯。我知道,一旦引入虚拟函数,函数表就会产生成本。我想知道C++编译器如何处理多态性而没有多态性。一方面,它不为VTe表分配内存,不在基类中创建V指针,因此编译器和运行时都比虚拟函数/ DROR少。你想完成什么?为什么编译要花更长的时间?只是好奇。我认为现在的编译器足够聪明:)增加的时间只有几毫秒,因为编译器必须构造继承树。这不值得关注。你是说“与非继承方法相同”吗?所有其他答案都是有效的,但这是我以前不知道/想到的。