首页 > 后端开发 > C++ > 正文

在 C 向量中的'push_back”操作期间,复制构造函数被调用多少次?

Susan Sarandon
发布: 2024-11-01 07:45:30
原创
748 人浏览过

How Many Times Does the Copy Constructor Get Called During `push_back` Operations in a C   Vector?

了解 Vector 的 Push_back 复制行为

在使用向量时,开发人员经常会遇到有关 Push_back 操作期间复制构造函数调用频率的查询。让我们通过一个示例深入研究此行为:

考虑以下 C 代码:

<code class="cpp">class Myint {
  int my_int;
public:
  Myint() : my_int(0) {
    cout << "Inside default" << endl;
  }
  Myint(const Myint& x) : my_int(x.my_int) {
    cout << "Inside copy with my_int = " << x.my_int << endl;
  }
};

int main() {
  vector<Myint> myints;
  Myint x;
  myints.push_back(x);
  x.set(1);
  myints.push_back(x);
}</code>
登录后复制

此代码段预计会在 Push_back 操作期间触发复制构造函数两次。但是,执行后,我们观察到以下输出:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1
登录后复制

为什么复制构造函数似乎被调用了三次?

  • Push_back 插入:第一个push_back操作将x插入到向量中,调用复制构造函数来初始化新创建的元素。
  • 向量重新分配:当第二个元素被push_back时,向量遇到它的容量限制并重新分配内存。由于 Myint 缺少隐式定义的移动构造函数,因此再次使用复制构造函数。这次,它复制了第一个元素(my_int 仍为 0),然后复制了 x(my_int 更新为 1)。

因此,复制构造函数总共被调用了 3 次。要优化此行为:

  • 提前预留内存:通过指定更高的向量容量,可以降低重新分配的可能性并最大限度地减少复制。
  • 使用 emplacement 代替 push_back: myints.emplace_back(0) 直接在向量中构造一个新元素,避免额外的副本。

以上是在 C 向量中的'push_back”操作期间,复制构造函数被调用多少次?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!