首页  >  文章  >  后端开发  >  为什么“vector::push_back”调用复制构造函数的次数似乎超出预期?

为什么“vector::push_back”调用复制构造函数的次数似乎超出预期?

Linda Hamilton
Linda Hamilton原创
2024-10-31 22:56:28471浏览

Why Does `vector::push_back` Seem to Call the Copy Constructor More Than Expected?

向量的push_back:揭示隐藏的复制构造函数调用

在一个令人困惑的场景中,向量的push_back方法似乎调用了复制构造函数比预期的次数多。为了研究这种行为,让我们深入了解具体细节。

考虑提供的代码片段:

<code class="cpp">class Myint
{
    //...
};

vector<Myint> myints;
Myint x;

myints.push_back(x);
x.set(1);
myints.push_back(x);</code>

最初,x 被推入向量中。正如预期的那样,在初始化期间发生一份副本。但在检查输出后,我们发现复制构造函数被调用了三次,而不是预期的两次。是什么导致了这种差异?

向量的内部行为开始发挥作用。当向量用完空间时,它必须重新分配内存。在我们的例子中,第二个push_back触发重新分配。由于没有为 Myint 隐式定义移动构造函数,因此使用复制构造函数。因此,第一个元素被复制到新分配的内存中,然后是 x 的第二个副本。此附加副本解释了复制构造函数的第三次调用,其中 x 将 my_int 设置为 1。

因此,总共发生了三次复制构造函数调用。这个数字可能会根据实现和初始向量容量而有所不同,但至少两次调用。

为了缓解这个问题,请考虑使用reserve方法提前保留更多内存。这确保了足够的容量,避免不必要的重新分配:

<code class="cpp">myints.reserve(2); // Allows two insertions without reallocation</code>

此外,可以使用 emplace_back 方法来删​​除副本:

<code class="cpp">myints.emplace_back(0); // Creates a new element directly in the vector</code>

emplace_back 将任意参数转发给构造函数,绕过副本或移动。

以上是为什么“vector::push_back”调用复制构造函数的次数似乎超出预期?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn