簡體   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