大家好,当一个类有一个向量作为它的数据成员时,为啥它的大小总是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() 是一个编译时间常数。它只测量对象的大小,而不是对象动态分配的任何内存的大小。 非常感谢。我在想 vector vec 和 new vector 之间有什么区别,因为 vector 是动态分配的。 new vector&lt;int&gt; 创建一个动态分配的向量。不同之处在于对象本身将被动态分配,因此在您的情况下,所有 24 个字节也将在免费存储中。注意:在大多数情况下使用它没有多大意义。 你很高兴回答我的问题。所以当我使用新向量时,我只是从堆中分配 24Bytes,向量的内容总是动态分配的。更重要的是,当我使用vector *v = new vector时,v = 0x71dcf0。当我使用vector vec, &vec[0] = 0x7fd2e10a4010时,这两个地址有什么区别。我的电脑是64位的。 【参考方案1】:

sizeof() 为您提供对象在内存中占用的字节数。 std::vector 类是一个容器,它有自己的成员变量来管理它所代表的内部数组,并且它们被计算为大小的一部分。在您的情况下,ab 的元素数量都太少,无法重新分配其内部数组以容纳比最初用于容纳单个元素的更多内容。

为了说明,我的编译器在这两种情况下都返回 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 个字节。作为一个动态数组,向量动态分配内存来保存它的内容。向量类中的实际内容是向量的容量、当前大小和指向数据的指针。班级规模始终是静态的

【讨论】:

非常感谢。我在想 vector vec 和 new vector 之间有什么区别,因为 vector 是动态分配的。 vector类本身不是动态分配的。向量使用动态分配来存储其数据。使用new vector&lt;int&gt; 将从堆中分配并要求您稍后再使用delete。否则,它们的功能完全相同,因为它们是同一个类。您只是以不同的方式分配了用于该类的内存。 所以当我使用 new vector 时,我只是从堆中分配 24Bytes,vector 的内容总是动态分配的。当我使用vector *v = new vector时,v = 0x71dcf0。当我使用vector vec, &vec[0] = 0x7fd2e10a4010时,这两个地址有什么区别。我的电脑是64位的。 我认为您对我所说的内容感到困惑。我不是指成员变量。我的意思是动态分配数组以允许动态数组。 vector&lt;int&gt; 在需要存储 ints 时调用 new int[whateverSizeItNeeds]。向量本身(即容量、大小和指向数组的指针)不是动态分配的,除非您使用new 明确这样做 谢谢你,我想我现在明白你的意思了。

以上是关于大家好,当一个类有一个向量作为它的数据成员时,为啥它的大小总是24? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

数据“未在此范围内声明的成员”

为啥在向量类中实现 operator= 时返回 const 引用

当我们已经拥有更强大的向量时,为啥还需要堆栈?

如何允许访问向量是类成员的向量元素?

不明白java中的泛型和抽象类有啥区别,感觉他们作用一样啊,为啥要用2种方法呢

将“push_back”用于带有“get”函数C++的向量