在向量的复制/移动分配时,底层存储会发生什么?

goo*_*era 10 c++ string vector language-lawyer c++11

对于std :: vector的副本分配,当源的大小小于目标的容量时,是否允许重新分配存储和容量缩减?或者是否保证不会发生重新分配/收缩(即始终遵守先前的保留())?

另一方面,如果源的大小大于目的地的容量并且重新分配,则需要重新分配是否与源的容量相关(例如,目的地的新容量应不小于源的容量,或者甚至需要它们是一样的)?或者重新分配只是完成其工作(基于新的大小)而不考虑源的容量?

至于移动分配,我认为不会进行存储重新分配(虽然我未能在标准中找到相关部分),那么它是否意味着目标新容量的值与源的旧容量完全相同?我能期望v = vector<T>{};产生同样的效果vector<T>{}.swap(v);吗?

我想答案都隐藏在标准的某个地方,但我却找不到它们.(如果C++ 11和C++ 03的内容不同,我想知道两者的各种要求.)

PS:对于上述问题的答案,对于std :: string是否相同(仅在C++ 11中,这意味着连续存储而且没有COW,C++ 03字符串不在雷达中)?

Kla*_*end 0

回答你的 PS:至少对于std::string,你不能假设字符串的处理与字符向量的处理类似。

COW(写入时复制)并不是强制实现字符串的,并且并非所有库实现都这样做。

  • “COW(写时复制)不是强制性的..”我的理解是,在 C++11 中,强制*不*使用 COW。(更准确地说,现在要求迭代器在某些写入操作下保持有效) (11认同)