为什么C++;增加对象的大小';你在吗? 我知道这听起来像是一个奇怪的问题,但是我只是想知道C++中的类是否比一个具有相同数据字段的结构更重,而且有一件事我找不到答案…… 考虑这一点: struct SomeStruct { int a; int b; }; class SomeClass { public: SomeClass():a(0),b(0){} private: int a; int b; }; int main() { std::cout<<sizeof(SomeStruct)<<std::endl; // output is 8 std::cout<<sizeof(SomeClass)<<std::endl; // output is 8 } struct SomeStruct{ INTA; int b; }; 上课{ 公众: SomeClass():a(0),b(0){} 私人: INTA; int b; }; int main(){ std::cout

为什么C++;增加对象的大小';你在吗? 我知道这听起来像是一个奇怪的问题,但是我只是想知道C++中的类是否比一个具有相同数据字段的结构更重,而且有一件事我找不到答案…… 考虑这一点: struct SomeStruct { int a; int b; }; class SomeClass { public: SomeClass():a(0),b(0){} private: int a; int b; }; int main() { std::cout<<sizeof(SomeStruct)<<std::endl; // output is 8 std::cout<<sizeof(SomeClass)<<std::endl; // output is 8 } struct SomeStruct{ INTA; int b; }; 上课{ 公众: SomeClass():a(0),b(0){} 私人: INTA; int b; }; int main(){ std::cout,c++,destructor,C++,Destructor,大小增加是因为virtual。如果不将析构函数设置为virtual,则不会看到大小增加 因此,不是析构函数使类型变大,而是添加了一个虚拟函数 所讨论的8个额外字节是指向您正在使用的类的虚拟表()的指针。如注释中所述,这是一种“一次性”成本。向类添加一个虚拟函数会带来此成本,但您看不到额外虚拟函数的成本 编辑: 类中的额外大小将取决于它是编译为32位还是64位程序。到虚拟表的链接在32位上需要额外4个字节,在64位平台上需要额外8个字节。这不是您添加了析构函数,而是您添加了虚拟方法(额外的虚拟方法

大小增加是因为
virtual
。如果不将析构函数设置为virtual,则不会看到大小增加

因此,不是析构函数使类型变大,而是添加了一个虚拟函数

所讨论的8个额外字节是指向您正在使用的类的虚拟表()的指针。如注释中所述,这是一种“一次性”成本。向类添加一个虚拟函数会带来此成本,但您看不到额外虚拟函数的成本

编辑:


类中的额外大小将取决于它是编译为32位还是64位程序。到虚拟表的链接在32位上需要额外4个字节,在64位平台上需要额外8个字节。

这不是您添加了析构函数,而是您添加了虚拟方法(额外的虚拟方法不会产生额外的每个实例成本)C++实现使用虚拟函数指针表来实现动态调度,这需要指向每个对象中存储的适当表的指针。指向虚拟表的指针是每个对象所需的额外空间。

< P>当声明析构函数为虚拟时,编译器自动将VTABLE指针添加为M。这是必需的,这样它就可以找到从您的类派生的类的所有析构函数的地址


这个新成员(您不能随意访问,您也不应该访问)被添加到类中,因此它的大小增加了一个普通原始指针的大小,该指针的大小通常与int相同,但可能取决于您的体系结构。

您添加了一个需要指向虚拟表(vtable)的指针的虚拟函数.已经给出了正确的答案,但我想补充一点,您不必要地将析构函数设置为虚拟的事实看起来像是“所有析构函数都必须是虚拟的”的应用程序10-20年前,某些程序员显然认为这是个好主意。这真的是个坏主意。@Christian-你能详细说明一下吗?为什么这真的是个坏主意?@ChristianHackl,Eclipse自动为我生成了虚拟的。在不需要析构函数的地方创建虚拟析构函数可能很容易使对象的大小增加一倍,而且给程序员一种错误的印象,认为类是从中派生出来的。这会造成混乱,破坏值类和具有标识的类之间在设计上的重要区别。这只是一个非常无用的指导方针,试图解决一个经验丰富的程序员所不存在的问题,而这个问题只是f初学者类设计中的实际问题。值得注意的是,如果你有任何虚拟函数,你只需支付一次这个价格。之后,其余的就不需要花费任何费用了。@so.very.wear添加类的第一个虚拟函数会增加大小,因为指向a的指针将被添加到每个对象实例中。我明白了……那么为什么要添加更多虚拟函数呢类的函数并没有进一步增加其大小?您不需要每个虚拟函数都有一个指针吗?您认为其他虚拟函数也需要指针,您是对的。但是,这些指针对于类的每个实例都是相同的,因此实现只需要一个指针就可以链接到一个po表列出每个虚拟函数的地址的inters。总之,它是指向指针列表的指针。@So.very.wear可能会有所帮助。
virtual
方法是类的属性,类实例只需要指向其类表的指针。指针大小可能与int大小不同。因此,我认为您可以改进在那句话上。否则是个好答案。
struct SomeStruct {
    int a;
    int b;
};

class SomeClass {
public:
    SomeClass():a(0),b(0){}
    virtual ~SomeClass(){}
private:
    int a;
    int b;
};

int main() {
    std::cout<<sizeof(SomeStruct)<<std::endl; // output is 8 bytes
    std::cout<<sizeof(SomeClass)<<std::endl; // output is 16 bytes!
}