三行代码  ›  专栏  ›  技术社区  ›  Agrudge Amicus

为什么std::pair的sizeof与其元素的sizeof之和不同?[副本]

  •  2
  • Agrudge Amicus  · 技术社区  · 2 年前

    我想创造一个 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个 ,大小 内景 我的系统是 4 .

    有人能解释一下9码是怎么回事吗 int s是24,加上 first 成员 一对 变成32了?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Andreas Wenzel    2 年前

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

    所以,打电话的时候 sizeof 在实际的向量上,只得到用于向量管理的数据成员的大小,而不是向量逻辑上“包含”的数据的大小。

    其他具有固定长度的“container”类(如std::array或std::pair)可能在实现时没有指向动态分配内存的指针,因此在它们上使用sizeof运算符可能会按预期工作。但是,这是特定于实现的,不可依赖。

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