gpt4 book ai didi

c++ - 重新分配结构的 std::vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:26 25 4
gpt4 key购买 nike

假设我们有一个 structstd::vector:

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. 一种结构 vector 在内部“保存指针记录”到每个单独的结构,因此如果重写 vector ,只会重写这些指针,而不是实际数据

?


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

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

最佳答案

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

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

关于c++ - 重新分配结构的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45224395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com