3

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

4

5 回答 5

4

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

例如,gcc 32bitssizeof(std::vector<T>)是 12(3 个指针),但它可能管理数百万个实例,T其本身可能很大。

于 2013-10-29T20:28:15.647 回答
4

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

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

于 2013-10-29T22:51:08.610 回答
2

即使使用 C,您也会受到填充、对齐等的摆布。话虽如此,如果您知道成员变量的大小,C++ 中struct/的大小通常是可以预测的。class这变得有点模糊的唯一一次是当你开始引入virtual functions和时virtual inheritance。在这种情况下,编译器需要存储一些额外的簿记信息。无论如何,每个对象的大小在编译时是已知的,因此sizeof操作符是编译时的特性(这解释了为什么它可以用于模板元编程。)

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

于 2013-10-29T20:27:37.323 回答
2

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

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

class Unknown;
class Failure {
   Unknown x;
};

使用指针使声明有效:

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

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

于 2013-10-29T20:50:09.433 回答
1

是与否!class或者struct可以为堆中的实习数据分配任意大小。不过,管理这个的成员将设置一个固定大小的结构。

于 2013-10-29T20:29:31.933 回答