C++的大小向量是24?

uujelgoq  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(159)

我只是在学习向量和结构体,有一次,我试着以字节为单位输出向量的大小。代码如下:

#include <iostream>
#include <vector>

struct Foo{
    std::vector<int> a;
};

int main()
{
    using std::cout; using std::endl;   

    Foo* f1 = new Foo;

    f1->a.push_back(5);
    cout << sizeof(f1->a) << endl;
    cout << sizeof(f1->a[0]) << endl;

    delete[] f1;
}

输出为244
显然第二行打印了4,因为这是int的大小。但为什么另一个值是24呢?向量是否占用24字节的内存?谢谢!

ryevplcw

ryevplcw1#

虽然std::vector的公共接口是由标准定义的,但可以有不同的 * 实现 *:换句话说,std::vector的底层内容可以随实现的不同而改变。
即使在相同的实现中(例如:Visual C++的给定版本附带的STL实现),std::vector的内部结构可以在发布版本和调试版本之间发生变化。
您看到的24大小可以解释为3个指针(每个指针在64位体系结构上大小为8字节;所以你有3 x 8 = 24字节)。这些指针可以是:

  • 向量开始
  • 向量末端
  • 用于向量的保留存储器的结束(即,vector's capacity
kxkpmulp

kxkpmulp2#

下面是来自libc++的代码(忽略压缩对,它是一个迭代器,用于维护向量的容量)。下面是实现中的3个指针。

pointer                                    __begin_;
pointer                                    __end_;
__compressed_pair<pointer, allocator_type> __end_cap_;

由于指针在64位CPU上的大小为8字节,这就是为什么8*3 = 24字节。

相关问题