向量的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中文网其他相关文章!