我习惯了C的固定大小的结构。 不知道C ++对象是否已修复。我的意思是总是可以预测一个物体的大小是多少?在编译时间?和/或运行时间?或者不可能,除非使用sizeof运算符? 我知道它依赖于硬件平台。除此之外,还有什么?
答案 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 functions
和virtual inheritance
时,唯一一次变得有点模糊。在这种情况下,编译器需要存储一些额外的簿记信息。无论如何,每个对象的大小在编译时都是已知的,因此sizeof
运算符是编译时功能(这解释了为什么它可以用于模板元编程。)
C ++遵循“不为你不用的东西付费”的原则。如果您所做的只是将类似的数据和函数组合到一个类中,那么您的对象的行为就像它们是带有全局函数的C中的结构一样。如果您需要更多高级功能,那么您需要按使用付费。
答案 3 :(得分:2)
任何类型都有众所周知的大小,点。 (动态内存分配不考虑)
仅使用类型的前向声明的声明无效:
class Unknown;
class Failure {
Unknown x;
};
使用指针使声明有效:
class Unknown;
class Success {
Unknown *x;
};
实际上C和C ++没有区别。两者都需要众所周知的尺寸。
答案 4 :(得分:1)
是和否! class
或struct
可以为堆中的实际数据分配任意大小。管理此成员的成员将设置固定大小的结构。