Closed CS-liujf closed 2 hours ago
当vector中的数据类型是自定义类时,会存在几次构造函数的调用
#include <iostream> #include <vector> class Widget { public: Widget() { std::cout << "Widget constructed\n"; } Widget(const Widget&) { std::cout << "Widget copied\n"; } Widget(Widget&&) { std::cout << "Widget moved\n"; } }; int main() { std::vector<Widget> vec; auto w = Widget(); vec.push_back(w); std::cout<<'\n'; vec.push_back(Widget()); std::cout<<'\n'; vec.emplace_back(); return 0; }
运行上述代码,我的结果是
Widget constructed Widget copied Widget constructed Widget moved Widget copied Widget constructed Widget copied Widget copied
gcc (Debian 12.2.0-14) 12.2.0
直接运行
第二种触发了移动构造为什么还有拷贝构造,第三种为什么有两个拷贝构造
无
你插入新的元素后vector要扩容然后将原有的元素移动到新的位置,这一部分操作造成的copy,可以考虑再插入两个元素,如果copy调用次数增加,应该就是这样的
数增加,应该就
谢谢,我刚才试了试使用reserve函数先把位置预留出来,就和我的预期一样了
Background | 背景
当vector中的数据类型是自定义类时,会存在几次构造函数的调用
Describe | 问题描述
运行上述代码,我的结果是
Desktop | 环境
gcc (Debian 12.2.0-14) 12.2.0
To Reproduce | 复现步骤
直接运行
Expection | 预期结果
第二种触发了移动构造为什么还有拷贝构造,第三种为什么有两个拷贝构造
Solution by you | 已尝试的方案
无
Additional context | 额外补充
无