类的内存是否比C ++中的成员大?

时间:2017-09-13 20:43:45

标签: c++ memory

我们说我有一些班级,他们唯一的成员是int。如果它不在一个类中,那么int就是4个字节。该类是否占用超过4个字节的内存(在C ++中)?

2 个答案:

答案 0 :(得分:5)

关于一个班级最终有多大的决定是针对具体实施的,取决于很多不同的因素。有时,由于结构和类填充,类可能最终大于其成员的大小。如果你的班级中有任何虚函数,那么你通常会在类的前面加一个virtual function table pointer(vtable指针)来增加一点空间。并且完全有可能编译器可能只是因为它会使你的类比它的成员的大小更大,如果它认为它会以某种方式帮助(或者如果你有一个懒惰的编译器!)

在你的情况下,使用一个32位整数,如果类最终大于整数本身,我会感到惊讶,因为你没有使用任何虚函数而且没有&# 39; t任何成员之间插入填充字节。但是,您不一定要跨系统依赖此。

如果您正在处理的应用程序绝对必要,那么您的班级与字段的大小相同 - 例如,如果您是读取原始字节并希望将它们重新解释为类对象 - 您可以使用static_assert来检查它:

class MyClass {
   ...
};
static_assert(sizeof(MyClass) == sizeof(int), "MyClass must have the same size as an integer.");

许多编译器都有自定义选项(通常通过#pragma指令),您可以调整这些选项以确保按照您喜欢的方式调整类的大小,因此您也可以考虑阅读。< / p>

答案 1 :(得分:0)

实际大小取决于实现,因此可以根据填充和其他实现细节在不同的编译器和体系结构中进行更改。永远不要相信以下伪代码中的简单总和:

size = sizeof(member1) + ... + sizeof(memberN)

此外,如果该类具有虚函数,是的,它可以超过4个字节。

此外,在虚函数和类继承的情况下,一眼就能理解大小:

  • 每个包含虚函数的类都会在内存中存储一​​个vtable,其中包含指向这些虚函数的函数指针。
  • 具有虚函数的A类继承自另一个具有虚函数的B类,可能需要多个表来存储A和B函数指针。

有关详细信息,请参阅此答案:how to determine sizeof class with virtual functions?