如何计算将对象推入向量时使用复制构造函数的次数?
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)。
将两个元素压入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)。