【问题标题】:How to calculate the number of using copy constructor when pushing objects into a vector? [duplicate]将对象推入向量时如何计算使用复制构造函数的次数? [复制]
【发布时间】:2019-03-25 12:15:59
【问题描述】:

将两个元素推入向量时,我认为应该使用两次复制运算符。当对象解构时使用析构函数。但是,结果显示它使用了 3 次复制构造函数,并在推送对象后立即使用了一次析构函数。那么这个问题的原因是什么?

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;
}

【问题讨论】:

    标签: c++ copy-constructor


    【解决方案1】:

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

    首先,std::vector 有足够的空间仅存储 1 元素。你push_back(第一个副本-c'tor)并且该空间已被占用。然后,您再次push_back,这需要分配更多空间。 vector 分配更多空间,复制先前插入的x1(第二次复制-c'tor)并推回x2(第三次复制-c'tor)。

    如果您使用C++11 及以后的版本,并且熟悉move semantics,则可以为您的类指定一个移动构造函数,这可能会使std::vector 在重新分配期间使用它(under some specific circumstances)。

    【讨论】:

    • 正是我想要的答案,很清楚!虽然我了解了容器如何管理其空间,但我在这个问题上错过了这一点。谢谢我的朋友!
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多