重新分配struct的std :: vector

时间:2017-07-20 20:14:54

标签: c++ vector memory-management struct

假设我们有std::vectorstruct s:

struct abc {
    wstring a;     // length between 0 and 200, 100 on average
    long b;
    long c;
};

std::vector<abc> v;    // 1 - 10 millions of items will be there

重新分配时会发生什么情况(例如因为push_back()时容量太小,或者我自己突然用v.reserve(v.size() + 100000增加了容量?)

更确切地说:

  1. 所有可能被重写的数据(即所有wstrings都被重写等)。
    1. 结构类型的向量 - 内部“保持指针记录”到每个单独的结构,所以如果向量被重写,只有这些指针被重写,而不是实际数据
    2. 为了使问题更清楚,它是否像这样

      enter image description here

      或者像这样:

      enter image description here

      或者这个:

      enter image description here

      或其他方式?

      供将来参考的其他信息:

      struct abc { wstring a; int b; int c; }; 
      wcout << sizeof(wstring);   // 32
      wcout << sizeof(int);       // 4
      wcout << sizeof(abc);       // 40, so this means there's probably no extra byte 
                                  //     used by the "struct" envelope itself
      wcout << sizeof(tuple<wstring, int, int>); // 40 too
      

1 个答案:

答案 0 :(得分:5)

std::vector存储abc个对象,而不是指向它们的指针。在C ++ 11之前,将向量的容量扩展到已分配的容量(可能大于向量的大小)之前,需要将实际对象复制到新分配的数组中。

从C ++ 11 MoveInsertable概念开始。现在,数据从旧位置移动到新位置,这在重新分配和CPU周期方面可能明显更便宜。特别是wstring内的abc s不需要复制字符串本身的内容,这可能是一个相当大的潜在节省。