繁体   English   中英

分配空的 std::vector 是否与交换空的 std::vector 相同?

[英]Is assigning empty std::vector same as swaping for an empty std::vector?

C++ 删除向量、对象、空闲 memory指出,为了在清除 std::vector 后释放分配的堆 memory,可以执行以下操作:

vector<int>().swap(myVector);

这是有道理的,但我想知道以下是否不会达到同样的效果。 有人可以告诉我是否有区别吗?

myVector = vector<int>();

根据标准,不允许从(非std::array )容器的右值赋值(即:移动赋值) 调用T的移动构造函数或赋值运算符,除非该容器的分配器不会在容器上传播移动分配 这意味着此类分配器的vector s 的唯一有效实现是销毁当前分配并采用右值中的分配。 std::allocator确实在容器移动分配上传播,因此此类容器的任何移动分配都将强制采用右值的内容。

这是否意味着myVector = vector<int>(); 保证采用空分配? 不必要。 一个实现检测到右值容器为空,销毁它自己的元素,但保留它的内部分配以供以后使用是完全有效的。

相比之下, vector::swap的实现做同样的事情是不可行的。 迭代器/指针/引用保存要求确保一个容器中对象的迭代器/指针/引用映射到另一个容器中的对象(只要分配器通过容器交换上的传播允许这一点)。 这意味着两个对象中的分配实际上必须交换,即使其中一个没有分配。 赋值没有这样的迭代器保存要求。

话虽如此,假设实现将是病态的并积极尝试避免您尝试删除容器的分配并不是一个好主意。 同样,对shrink_to_fit的调用不能保证容量会发生变化……但是没有发生变化的实现将是一个非常愚蠢的实现。

所以有人可能会争辩说,最好的代码应该是清楚地解释正在发生的事情的代码。 swap是一个成语,你必须让别人解释你为什么在这样的prvalue上使用它。 clear()后跟shrink_to_fit可以从文档中清楚地了解您在做什么; 无需解释。

所以也许考虑这样做。

这些替代方案之间没有显着差异。

但是,我推荐第三种选择,因为它对读者来说更明显:

myVector.clear();
myVector.shrink_to_fit();

有人可以告诉我是否有区别吗?

如果是myVector = vector<int>();

旧的 memory不一定被释放(释放)。

但是在vector<int>().swap(myVector);的情况下

旧的 memory 释放将发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM