【发布时间】:2014-04-10 19:01:58
【问题描述】:
对于 std::vector 的复制分配,当源的大小小于目标的容量时,是否允许重新分配存储和缩小容量?还是保证不会发生重新分配/收缩(即始终尊重先前的 Reserve())?
另一方面,如果源的大小大于目标的容量并且发生重新分配,是否要求重新分配尊重源的容量(例如目标的新容量不应小于源的容量,或者甚至要求它们相同)?或者重新分配只是完成其工作(基于新大小)而不考虑源的容量?
至于移动分配,我想不会发生存储重新分配(尽管我未能在标准中找到相关部分),所以这是否意味着目标的新容量的值将与源的旧容量完全相同?我可以期望v = vector<T>{}; 与vector<T>{}.swap(v); 具有相同的效果吗?
我想答案隐藏在标准中的某个地方,但我只是没能找到它们。 (如果 C++11 和 C++03 的情况不同,我想知道两者的各种要求。)
PS:对于上述问题的任何答案,std::string 是否相同(仅在 C++11 中表示连续存储且没有 COW,C++03 字符串不在雷达范围内)?
【问题讨论】:
-
我在 C++11 标准中看不到关于这一点的明确声明,但我认为容量不会缩小 - 在其他地方,向量优先考虑最小化重新分配和元素复制而不是存储.如果您想要控制,您可以致电
reserve()或shrink_to_fit(),尽管后者没有义务实际执行任何操作。如果在复制分配期间容量必须增加,恕我直言,将固定比例超过新大小是最有意义的。您可以轻松地在几个编译器上对此进行测试 - 不同的行为会反驳标准要求(可能!)。 -
我认为除了
capacity() >= size()的明显事实之外,该标准不保证分配后的容量。这对于允许 (a) 将源元素复制到目标现有分配中的实现,保持容量不变,以及 (b) 将元素复制并交换到新分配中以提供强大的异常保证的实现都是必要的。跨度> -
@LightnessRacesinOrbit:感谢重定向,但是,该问题及其答案并未提及复制/移动分配对存储分配和迭代器有效性的影响。
标签: c++ string c++11 vector language-lawyer