我对这两个班级的班级规模感到困惑。
谁能告诉我为什么输出是这样的 “ 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();
} ///:~
答案 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