如何计算将对象推入向量时使用复制构造函数的次数?

How to calculate the number of using copy constructor when pushing objects into a vector?

将两个元素压入vector时,我想应该是用了两次copy操作符。当对象解构时使用析构函数。但是结果显示,它使用了三次拷贝构造函数,并在压入对象后立即使用了一次析构函数。那么这个问题的原因是什么?

using namespace std;

struct X {
    X() { cout << "X()" << endl; }
    X(const X&) { cout << "X(const X&)" << endl; }
    X& operator=(const X& xr) { cout << "operator=(const X& xr)" << endl; return *this; }
    ~X() { cout << "~X()" << endl; }
};

void fcn1(X x1, X &x2, X *x3) {
    cout << "fcn1 start" << endl;

    vector<X> v1;
    cout<<"push x"<<endl;
    v1.push_back(x1);
    v1.push_back(x2);

    cout << "fcn1 end" << endl;
}

那是因为 std::vector 如何管理自己的缓冲区。如果您首先 v1.reserve(2) 编辑 space,您将不会看到由于插入最多两个元素而导致的重新分配,并且正如预期的那样,只有两个复制构造函数调用。

首先,std::vector 有足够的 space 来存储 1 元素。你 push_back (第一个复制人)和那个 space 被占用了。然后,你又push_back,这需要分配更多space。 vector 分配更多 space,复制先前插入的 x1(第二个复制器)并推回 x2(第三个复制器)。

如果您使用的是 C++11 及更高版本,并且在重新分配期间熟悉 move semantics, you can specify a move-constructor to your class, which will likely make std::vector use it (under some specific circumstances)。