簡體   English   中英

C ++ 11多個移動構造函數調用

[英]C++11 Multiple move constructor call

我用g++ -std=c++11 file.cpp編譯了這個,我很困惑通過研究C++的move構造函數。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class P {
public:
    string* ptr_;
    P(string name) { ptr_ = new string(name); }
    ~P() { delete ptr_; }
    P(P&& pother) : ptr_(move(pother.ptr_)) { 
        cout<<"move"<<endl; 
        pother.ptr_=nullptr; 
    }
    void print() {cout << *ptr_ << endl;}
};

int main()
{
    vector<P> ppl;
    ppl.push_back(P("Jojo"));
    ppl.push_back(P("Jojo"));
    ppl.push_back(P("Jojo"));
}

該程序的輸出是:

$ ./a.out 
move
move
move
move
move
move

為什么移動構造函數在這里調用了6次?

因為std::vector::push_back會導致重新分配; 當new size()大於capacity() vector分配新的底層存儲,並且所有當前元素都會通過移動構造函數移動到新存儲。 在重新分配期間移動元素會導致移動構造函數的這些多次調用。

標准沒有明確規定容量增長的方式; 我想這里每次重新分配都會加倍

ppl.push_back(P("Jojo")); // 0 element(s) moved, 1 element added, 1 move(s) in all; size=1, capacity=1
ppl.push_back(P("Jojo")); // 1 element(s) moved, 1 element added, 2 move(s) in all; size=2, capacity=2
ppl.push_back(P("Jojo")); // 2 element(s) moved, 1 element added, 3 move(s) in all; size=3, capacity=4

// assume the 4th push_back is performed
ppl.push_back(P("Jojo")); // 0 element(s) moved, 1 element added, 1 move(s) in all; size=4, capacity=4

因此移動構造函數被調用了6次。 順便說一句,如果再次執行push_back ,則只會調用一次移動構造函數; 因為第4次push_back沒有重新分配。

您可以使用std::vector::reserve來避免重新分配。

vector<P> ppl;
ppl.reserve(3); // prohibit reallocations for the following 3 push_back
ppl.push_back(P("Jojo"));
ppl.push_back(P("Jojo"));
ppl.push_back(P("Jojo"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM