为什么C++中的析构函数会增加它们所在对象的大小?

so.*_*red 7 c++ destructor

我知道这可能听起来像一个奇怪的问题,但我只是想知道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
}
Run Code Online (Sandbox Code Playgroud)

但现在看看当我向SomeClass添加析构函数时会发生什么:

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!
}
Run Code Online (Sandbox Code Playgroud)

为什么SomeClass需要8个字节用于析构函数?

Mic*_*nda 17

尺寸增加是因为virtual.如果不使析构函数为虚拟,则不会看到大小增加.

因此,不是析构函数会使您的类型更大,而是它正在添加一个正在执行它的虚函数.

有问题的8个额外字节是指向您正在使用的类的虚拟表(vtable)的指针.如评论中所述,这是"一次性"成本.向类中添加一个虚拟函数会带来这种成本,但是您没有看到使用其他虚拟函数的成本.

编辑:

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