大家好,当一个类有一个向量作为它的数据成员时,为啥它的大小总是24? [复制]
Posted
技术标签:
【中文标题】大家好,当一个类有一个向量作为它的数据成员时,为啥它的大小总是24? [复制]【英文标题】:hello everyone,when a class has a vector as it's data member,why its size is always 24? [duplicate]大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24? [复制] 【发布时间】:2018-09-13 15:29:08 【问题描述】:这是课程
class A
public:
vector<int> vvv11;
;
class B
public:
vector<int> vvv21,2,3,4,5;
;
和主要的
int main()
A a;/*sizeof(a) == 24;*/
B b;/*sizeof(b) == 24;*/
return 0;
为什么a的大小和b的大小都是24?
【问题讨论】:
sizeof(std::vector)
与std::vector::size()
/std::size(std::vector)
不相同。第一个为您提供该类型占用的字节数。另外两个给你包含的对象/元素的数量。此外,std::vector::capacity()
可以告诉您在需要重新分配/增长之前它当前可以存储多少元素。
记住sizeof()
是一个编译时间常数。它只测量对象的大小,而不是对象动态分配的任何内存的大小。
非常感谢。我在想 vectornew vector<int>
创建一个动态分配的向量。不同之处在于对象本身将被动态分配,因此在您的情况下,所有 24 个字节也将在免费存储中。注意:在大多数情况下使用它没有多大意义。
你很高兴回答我的问题。所以当我使用新向量sizeof()
为您提供对象在内存中占用的字节数。 std::vector
类是一个容器,它有自己的成员变量来管理它所代表的内部数组,并且它们被计算为大小的一部分。在您的情况下,a
和 b
的元素数量都太少,无法重新分配其内部数组以容纳比最初用于容纳单个元素的更多内容。
为了说明,我的编译器在这两种情况下都返回 32:
#include <vector>
int main()
std::vector<int> a 1 ;
std::vector<int> b 1,2,3,4,5 ;
int sizeA = sizeof(a); // Returns 32
int sizeB = sizeof(b); // Returns 32
return 0;
【讨论】:
【参考方案2】:向量内容的大小不会改变类的大小。在您当前使用的 std lib 实现中,矢量对象将始终占用 24 个字节。作为一个动态数组,向量动态分配内存来保存它的内容。向量类中的实际内容是向量的容量、当前大小和指向数据的指针。班级规模始终是静态的
【讨论】:
非常感谢。我在想 vectornew vector<int>
将从堆中分配并要求您稍后再使用delete
。否则,它们的功能完全相同,因为它们是同一个类。您只是以不同的方式分配了用于该类的内存。
所以当我使用 new vectorvector<int>
在需要存储 int
s 时调用 new int[whateverSizeItNeeds]
。向量本身(即容量、大小和指向数组的指针)不是动态分配的,除非您使用new
明确这样做
谢谢你,我想我现在明白你的意思了。以上是关于大家好,当一个类有一个向量作为它的数据成员时,为啥它的大小总是24? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在向量类中实现 operator= 时返回 const 引用