重新分配struct的std :: vector

Bas*_*asj 2 c++ struct memory-management vector

比方说,我们有一个std::vectorstructS:

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
Run Code Online (Sandbox Code Playgroud)

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

更确切地说:

  1. 所有数据都重写(即所有数据wstrings被重写,等等)

要么

  1. 一个struct类的向量 - 内部"保持指针的记录"到每个单独的结构,所以如果向量被重写,只有这些指针被重写,而不是实际的数据


为了使问题更清楚,它看起来像这样

在此输入图像描述

或者像这样:

在此输入图像描述

或者这个:

在此输入图像描述

或另一种方式?


其他信息供将来参考:

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
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

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

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