类的大小、成员函数的大小、继承的类大小
size of class, member function size, inherited class size?
我对这两个班级的班级规模感到困惑。
谁能告诉我为什么这个输出是"大小(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
,因此它们不占用任何每个对象的空间,因此不计入类型的大小。
此外,单纯的基类不会施加任何额外的内存使用,它们(它们的成员(只是与派生类的成员一起存储。虽然你把X
的i
隐藏在Y
中,但它仍然存在(可以通过显式规范(X::i
(访问(,并且除了Y
的i
之外还占用空间,因此给出了两个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
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数