假设我们有std::vector
个struct
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
增加了容量?)
更确切地说:
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
答案 0 :(得分:5)
std::vector
存储abc
个对象,而不是指向它们的指针。在C ++ 11之前,将向量的容量扩展到已分配的容量(可能大于向量的大小)之前,需要将实际对象复制到新分配的数组中。
从C ++ 11 MoveInsertable
概念开始。现在,数据从旧位置移动到新位置,这在重新分配和CPU周期方面可能明显更便宜。特别是wstring
内的abc
s不需要复制字符串本身的内容,这可能是一个相当大的潜在节省。