类的大小,成员函数大小,继承的类大小?

时间:2012-05-14 07:14:54

标签: c++ class

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

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

6 个答案:

答案 0 :(得分:3)

X包含四个字节的一个

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

答案 1 :(得分:1)

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

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

此外,仅仅基类不会强加任何额外的内存使用,它们(它们的成员)只是与派生类的成员一起存储。虽然您在X中隐藏i的{​​{1}},但它仍然存在(并且可以通过显式指定(Y)进行访问)并且除了{之外还占用空间{1}} X::i,因此每个都会提供两个Y个4字节。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

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

cl -d1reportAllClassLayout main.cpp