在内存中的课程比C 中的成员大
Are classes larger in memory than their members in C++?
假设我有一些唯一成员是int的班级。如果不在课堂上,那么单独的INT将是4个字节。该类是否需要超过4个字节的内存(在C 中)?
关于班级最终有多大的决定是特定于实施的,并且取决于许多不同的因素。有时,由于结构和课堂填充,课程可能最终要大于其成员的大小。如果您的课程中有任何虚拟功能,则通常会在类的前面使用虚拟功能表指针(VTable指针),以增加一些空间。而且,编译器完全有可能仅仅是为了使您的班级比成员的规模更大,如果它认为它会以某种方式提供帮助(或者如果您有懒惰的编译器!)
在您的情况下,使用一个32位整数,如果班级最终比整数大于整数本身,我会感到惊讶,因为您不使用任何虚拟功能,并且没有任何成员可以插入填充字节之间。但是,您不一定会在整个系统中依靠它。
如果您正在从事一个绝对必需的应用程序的应用程序,那么您的班级的大小与字段相同 - 例如,如果您正在阅读RAW BYTES并想重新解释它们作为类对象 - 您可以使用static_assert
检查以下检查:
class MyClass {
...
};
static_assert(sizeof(MyClass) == sizeof(int), "MyClass must have the same size as an integer.");
许多编译器都有自定义选项(通常是通过#pragma
指令),您可以调音以确保按照您想要的方式进行尺寸,因此您也可以考虑对此进行阅读。
实际大小取决于实现,因此由于填充和其他实现详细信息,它可以在不同的编译器和架构上进行更改。永远不要相信以下伪代码中的简单总和:
size = sizeof(member1) + ... + sizeof(memberN)
同样,如果类具有虚拟功能,是的,它可以超过4个字节。
此外,对于虚拟函数和类,继承大小可能很复杂,可以一见钟情:
- 包括虚拟函数的每个类都将在内存中存储一个可将vtable存储给这些虚拟函数的功能指针。
- A类具有虚拟函数,从另一个B类继承的虚拟函数也可能需要多个表来存储A和B函数指针。
有关更多详细信息,请参见此答案:如何使用虚拟功能确定sizeof类?
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 具有 STL 向量类型成员的类的复制内存
- C++具有模板成员变量的类. 和参数内存输出
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 删除类成员的动态分配内存的最佳方法是什么
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 使用 delete [] 运算符取消分配类中数据成员的内存
- 调用std::函数成员时内存损坏
- c++如何为类成员函数分配内存
- 当我们在C++中创建类的对象时,为成员函数分配的内存在哪里?
- QThreads - 为什么要在构造函数中分配内存而不是使用普通的类成员?
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 当课程成员成员时,为什么参考会占据内存
- C++非虚拟类成员变量内存布局?
- 非静态数据成员初始值设定项仅适用于 和动态内存
- 使用初始值设定项列表的初始化类成员会导致内存泄漏
- "new"不会将内存分配给作为类的数据成员的指针
- 对象和数据成员内存地址混淆
- C++ 删除析构函数中的向量类成员内存
- 类数据成员内存布局显示指针大小过大