类的大小、成员函数的大小、继承的类大小

size of class, member function size, inherited class size?

本文关键字:继承 成员 函数      更新时间:2023-10-16

我对这两个班级的班级规模感到困惑。

谁能告诉我为什么这个输出是"大小(X(=4;大小(Y(=8;

或者提供有关此问题的一些有用的链接/资源?

有人可以帮助我吗?

#include <iostream>
using namespace std;
class X {
    int i;
public:
    X() { i = 0; }
    void set(int ii) { i = ii; }
    int read() const { return i; }
    int permute() { return i = i * 47; }
};

class Y : public X {
    int i; // Different from X's i
public:
    Y() { i = 0; }
    int change() {
        i = permute(); // Different name call
        return i;
    }
    void set(int ii) {
        i = ii;
        X::set(ii); // Same-name function call
    }
};
int main() {
    cout << "sizeof(X) = " << sizeof(X) << endl;
    cout << "sizeof(Y) = "
        << sizeof(Y) << endl;
    Y D;
    D.change();
    // X function interface comes through:
    D.read();
    D.permute();
    // Redefined functions hide base versions:
    D.set(12);
    getchar();
} ///:~

X 包含一个由四个字节组成的 int

Y 包含两个 int,每个 int 四个字节,因为它还包含 X 的成员变量,即总共八个字节。

我认为问题标题表明您认为这些类由于其成员函数和基类而具有更大的大小。嗯,这是错误的。

在最终编译的代码中,成员函数与自由函数没有任何不同,只是隐式的第一个参数为 this ,因此它们不占用任何每个对象的空间,因此不计入类型的大小。

此外,单纯的基类不会施加任何额外的内存使用,它们(它们的成员(只是与派生类的成员一起存储。虽然你把Xi隐藏在Y中,但它仍然存在(可以通过显式规范(X::i(访问(,并且除了Yi之外还占用空间,因此给出了两个int,每个4个字节。

如果您有任何虚拟成员功能,情况会略有不同。在这种情况下,额外的间接寻址会有很小的内存开销(最有可能在指向虚拟函数地址列表的指针中,为 4/8 字节(。

因为 X 包含一个整数,Y 包含 2(其中一个是继承的(。计算机上整数的大小为 4 个字节。

类中的代码只存在于一个地方(与static数据成员相同(。它不会为每个类实例重复。因此,它不计入班级的规模。

sizeof(X)返回X实例的大小。在您的系统上,int 的大小为 4。然后使用 Y 及其数据扩展类。此类不是多态的,并且不需要额外的空间(例如,对于 vtables(或填充(以调整自然对齐(。

这里有一些相关的网站,我认为它可以对你有所帮助。

确定类对象的大小:http://www.cprogramming.com/tutorial/size_of_class_object.html

内存布局:http://www.phpcompiler.org/articles/virtualinheritance.html

而且,如果使用 MVSC,则可以使用 -d1reportAllClassLayout 转储解决方案中所有类的所有内存布局,如下所示:

cl -d1reportAllClassLayout main.cpp