在内存中的课程比C 中的成员大

Are classes larger in memory than their members in C++?

本文关键字:成员 内存 程比      更新时间:2023-10-16

假设我有一些唯一成员是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类?