Bas*_*asj 2 c++ struct memory-management vector
比方说,我们有一个std::vector的structS:
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)?
更确切地说:
wstrings被重写,等等)要么
?
为了使问题更清楚,它看起来像这样
或者像这样:
或者这个:
或另一种方式?
其他信息供将来参考:
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)
std::vector存储abc对象,而不是指向它们的指针.在C++ 11之前,将向量的容量扩展到已分配的容量(可能大于向量的大小)之前,需要将实际对象复制到新分配的数组中.
从C++ 11 MoveInsertable概念开始已经介绍.现在,数据从旧位置移动到新位置,这在重新分配和CPU周期方面可能明显更便宜.特别是,wstrings里面的abcs不需要复制字符串本身的内容,这可能是一个相当大的潜在节省.