我曾经使用C语言的固定结构体大小。不知道C++对象的大小是否固定。我的意思是对象的大小是否总是可以在编译时预测到?或者在运行时?还是只有使用sizeof操作符才能得知大小?我知道它取决于硬件平台,除此之外还有什么因素影响大小呢?
对象本身的大小可以通过调用sizeof
来获取,这在编译时是已知的。但是该对象可能管理其他资源,而无法直接知道该资源占用多少内存。
例如,在gcc 32位中,sizeof(std::vector<T>)
为12(3个指针),但它可能管理着数百万个可能很大的T
实例。
std::string
和std::map
,都将数据存储在堆上,因此它们的大小是固定的。 - heLomaN当然,C++对象有固定的大小。如果大小不确定,并且您制作了一个对象数组,编译器如何知道要分配多少空间?
这里适用于结构体的相同规则,每种数据类型的大小总和加上任何填充以对齐,如果使用任何虚拟函数,则需要额外4或8字节的V表指针,具体取决于计算机的架构。
new int[x]
是反例。数组是单个对象,即使是像这样的可变长度数组也是如此。“编译器如何知道为这些数组分配多少空间?”不是反驳:没有可变长度数组的数组。 - MSaltersnew int[x]
,那么显然需要一个指向堆上动态分配的整数的指针。这个指针的大小将根据架构略有不同。当然,这个分配的数据与实际类或结构体的大小是分开的。所以
class Foo { int someInt; int* someInts; }
如果在32位系统上,int也是4字节大小,那么它总是8字节。如果在构造函数中,你有someints = new int[6400]
并且调用了Foo
的sizeof()
,它仍然是8字节。 - Lloyd Crawleyclass Unknown;
class Failure {
Unknown x;
};
class Unknown;
class Success {
Unknown *x;
};
实际上,C和C++并没有区别。两者都需要一个已知的大小。
class
或struct
可以从堆中分配其内部数据的任意大小。管理此类数据的成员将设置固定大小的结构。