C ++对象是否具有固定大小?

时间:2013-10-29 20:24:41

标签: c++ class object size

我习惯了C的固定大小的结构。 不知道C ++对象是否已修复。我的意思是总是可以预测一个物体的大小是多少?在编译时间?和/或运行时间?或者不可能,除非使用sizeof运算符? 我知道它依赖于硬件平台。除此之外,还有什么?

5 个答案:

答案 0 :(得分:4)

可以通过调用sizeof来检索对象本身的大小,并且在编译时已知。但是该对象可以管理其他一些资源,并且没有直接的方法可以知道该资源需要多少内存。

例如,gcc 32bits,sizeof(std::vector<T>)为12(3个指针),但它可能正在管理可能很大的T的几百万个实例。

答案 1 :(得分:3)

当然,C ++对象具有固定的大小。如果它没有修复,并且您创建了一个对象数组,编译器将如何知道要分配多少空间?

适用于结构的相同规则适用于此,从每种类型的数据大小加上任何用于对齐的填充的总和,如果使用任何虚拟函数,V表指针的额外4或8字节,具体取决于体系结构你的机器。

答案 2 :(得分:2)

即使使用C,你仍然可以使用填充,对齐等。如果你知道成员的大小,C ++中struct / class的大小通常是可以预测的。变量。当你开始介绍virtual functionsvirtual inheritance时,唯一一次变得有点模糊。在这种情况下,编译器需要存储一些额外的簿记信息。无论如何,每个对象的大小在编译时都是已知的,因此sizeof运算符是编译时功能(这解释了为什么它可以用于模板元编程。)

C ++遵循“不为你不用的东西付费”的原则。如果您所做的只是将类似的数据和函数组合到一个类中,那么您的对象的行为就像它们是带有全局函数的C中的结构一样。如果您需要更多高级功能,那么您需要按使用付费。

答案 3 :(得分:2)

任何类型都有众所周知的大小,点。 (动态内存分配不考虑)

仅使用类型的前向声明的声明无效:

class Unknown;
class Failure {
   Unknown x;
};

使用指针使声明有效:

class Unknown;
class Success {
   Unknown *x;
};

实际上C和C ++没有区别。两者都需要众所周知的尺寸。

答案 4 :(得分:1)

是和否! classstruct可以为堆中的实际数据分配任意大小。管理此成员的成员将设置固定大小的结构。