交换空向量和将空向量分配给现有向量有什么区别?

pep*_*dip -2 c++ memory

有什么区别:

// bb has a million elements
vector<B>().swap(bb);
//and
bb = Vector<B>();
Run Code Online (Sandbox Code Playgroud)

幕后发生了什么?

Mat*_* M. 5

总的来说,两者的语义略有不同:

  • swap 将交换两个向量的内容
  • 分配会将右侧向量的内容复制到左侧向量,或者移动/窃取它,具体取决于您使用的 C++ 版本和一些额外参数

现在,特别是您的示例和std::vector

std::vector<B>().swap(bb);
Run Code Online (Sandbox Code Playgroud)

这会:

  • 创建一个空向量(我们称之为__tmp
  • 交换两个向量的内容(即交换它们的内部缓冲区)
  • __tmp连同以前的内容一起销毁bb

结果是bb留空了。

另一方面:

bb = std::vector<B>();
Run Code Online (Sandbox Code Playgroud)

bb将用空向量的内容覆盖 的内容。根据您使用的是 C++03 还是 C++11(或更高级),行为会有所不同:

  • 在 C++03 中, 的元素bb被破坏,但bb可能保留其容量(即,它像以前一样为一百万个元素分配了内存)
  • 在C++11中, 的内部缓冲区std::vector<B>可以替换bb或不替换;据我所知,没有正式义务

因此,虽然bbwill 是空的,但并不清楚它的内部容量最终是什么。


从历史上看,当人们想要确保减少其容量(以释放内存)时,std::vector<B>().swap(bb)这是清除内容的推荐方法。bb

如今(C++11 之后),有一个明确的shrink_or_fit方法可以做到这一点,但由于不强制要求实际减少容量,而且旧习惯很难改掉,因此您可能仍然会遇到这种形式。