为什么 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 int
s 的大小是 24,而在添加 pair
的 first
成员后它变成了 32?
尽管向量被称为 "container",从逻辑的角度来看,从编译器的角度来看,向量只是一个(模板)class,它包含一个指针(或可能有几个,取决于实现)动态分配内存和可能用于管理此内存的一些其他数据成员。向量 class 使用动态分配的内存根据需要扩展和收缩。
因此,在实际向量上使用 sizeof
运算符时,您只能获得用于向量管理的数据成员的大小,而不是逻辑上向量的数据大小 "contains".
其他"container" class具有固定长度的,例如std::array
或std::pair
,可能是在没有指向动态分配内存的指针的情况下实现的,因此使用sizeof
运算符可能会按您的预期工作。但是,这是特定于实现的,不能依赖。
这对中的第一个元素似乎占用 8 个字节而不是 4 个字节的原因可能是 alignment issue。第一个元素包含一个 4 字节成员,而向量可能包含至少一个 8 字节成员(可能是 64 位指针)。
我试图使用动态内存创建一个 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 int
s 的大小是 24,而在添加 pair
的 first
成员后它变成了 32?
尽管向量被称为 "container",从逻辑的角度来看,从编译器的角度来看,向量只是一个(模板)class,它包含一个指针(或可能有几个,取决于实现)动态分配内存和可能用于管理此内存的一些其他数据成员。向量 class 使用动态分配的内存根据需要扩展和收缩。
因此,在实际向量上使用 sizeof
运算符时,您只能获得用于向量管理的数据成员的大小,而不是逻辑上向量的数据大小 "contains".
其他"container" class具有固定长度的,例如std::array
或std::pair
,可能是在没有指向动态分配内存的指针的情况下实现的,因此使用sizeof
运算符可能会按您的预期工作。但是,这是特定于实现的,不能依赖。
这对中的第一个元素似乎占用 8 个字节而不是 4 个字节的原因可能是 alignment issue。第一个元素包含一个 4 字节成员,而向量可能包含至少一个 8 字节成员(可能是 64 位指针)。