1

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

谁能告诉我为什么这个输出是“ SIZEOF(X)=4; SIZEOF(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();
} ///:~
4

6 回答 6

3

X 包含四个字节中的一个整数

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

于 2012-05-14T07:17:05.630 回答
1

我认为问题标题表明您认为这些类的大小更大,因为它们的成员函数和基类。好吧,这是错误的。

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

此外,单纯的基类不会强加任何额外的内存使用,它们(它们的成员)只是与派生类的成员一起存储。尽管您将 's 隐藏在X'siY,但它仍然存在(并且可以通过显式规范 ( X::i) 访问)并且除了Y's之外还占用空间i,因此int每个 s 都有 4 个字节。

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

于 2012-05-14T07:21:43.360 回答
0

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

于 2012-05-14T07:18:51.087 回答
0

类中的代码只存在于一处(与static数据成员相同)。每个类实例都不会重复它。所以它不计入班级的规模。

于 2012-05-14T07:19:01.580 回答
0

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

于 2012-05-14T07:19:02.237 回答
0

这里有一些相关的网站,我想对你有帮助。

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

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

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

cl -d1reportAllClassLayout main.cpp

于 2015-06-05T18:57:41.657 回答