为什么 std::p air 的大小与其元素的大小之和不同?

Why is the sizeof a std::pair different to the sum of the sizeof its elements?

本文关键字:元素 air std 为什么      更新时间:2023-10-16

我试图使用动态内存创建一个pair类型,然后将其地址返回给调用函数,但在检查pair对象的大小时,我感到困惑:

pair<int,vector<int> > vec;                          //not dynamic definition
vec=make_pair(3,vector<int> {1,2,3,4,5,8,9,0,6});    //9 element in vector
cout<<sizeof(vec.second)<<endl;

输出:24

在做:sizeof(vec)输出为32,我的系统上int的大小为4.

有人可以解释一下 9ints 的大小是 24,添加pairfirst成员后它变成了 32?

尽管向量被称为"容器",从逻辑角度来看,从编译器的角度来看,向量只是一个(模板(类,它包含一个指针(或可能几个,取决于实现(到动态分配的内存,可能还有一些其他数据成员用于管理此内存。vector 类根据需要使用动态分配的内存进行扩展和收缩。

因此,在实际向量上使用sizeof运算符时,只能获得用于向量管理的数据成员的大小,而不是向量逻辑上"包含"的数据大小。

其他具有固定长度的"容器"类,例如std::arraystd::pair,可能在没有指向动态分配内存的指针的情况下实现,因此在它们上使用sizeof运算符可能会按预期工作。但是,这是特定于实现的,不能依赖。

该对的第一个元素似乎占用 8 个字节而不是 4 个字节的原因可能是对齐问题。第一个元素包含一个 4 字节成员,而向量可能包含至少一个 8 字节成员(可能是 64 位指针(。