为什么 std::p air 的大小与其元素的大小之和不同?
Why is the sizeof a std::pair different to the sum of the sizeof its elements?
我试图使用动态内存创建一个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
.
有人可以解释一下 9int
s 的大小是 24,添加pair
的first
成员后它变成了 32?
尽管向量被称为"容器",从逻辑角度来看,从编译器的角度来看,向量只是一个(模板(类,它包含一个指针(或可能几个,取决于实现(到动态分配的内存,可能还有一些其他数据成员用于管理此内存。vector 类根据需要使用动态分配的内存进行扩展和收缩。
因此,在实际向量上使用sizeof
运算符时,只能获得用于向量管理的数据成员的大小,而不是向量逻辑上"包含"的数据大小。
其他具有固定长度的"容器"类,例如std::array
或std::pair
,可能在没有指向动态分配内存的指针的情况下实现,因此在它们上使用sizeof
运算符可能会按预期工作。但是,这是特定于实现的,不能依赖。
该对的第一个元素似乎占用 8 个字节而不是 4 个字节的原因可能是对齐问题。第一个元素包含一个 4 字节成员,而向量可能包含至少一个 8 字节成员(可能是 64 位指针(。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 地图是否将元素存储为 std::p air?
- 如何打印属于地图的一系列元素(std::p air<size_t,std::string>)(不是所有元素)
- 如何最好地访问 std::p air 的元素?
- std::set with std::p air语言 - 如何为元素编写比较器
- 将元素从 std::vector 移动到 std::<T1>vector<std::p air<T1,T2>>