为什么 sizeof a std::pair 与其元素的 sizeof 之和不同?

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

我试图使用动态内存创建一个 pair 类型,然后 return 它是调用函数的地址,但是在检查 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.

谁能解释一下 9 ints 的大小是 24,而在添加 pairfirst 成员后它变成了 32?

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

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

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

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