emplace_back和push_back
vector的push_back与emplace_back对比解析
1. 核心机制
push_back
- 参数:已存在的对象
- 行为:通过拷贝或移动操作添加对象到末尾
- 触发机制:
左值对象触发拷贝构造函数
右值对象触发移动构造函数
emplace_back
- 参数:构造对象所需的原始参数
- 行为:在容器内存中直接构造对象
- 触发机制:仅调用一次构造函数
2. 性能对比
- push_back:存在临时对象构造和销毁开销,效率较低(对复杂对象更明显)
- emplace_back:避免中间步骤,直接构造对象,性能更优
3. 使用场景
推荐push_back的情况:
- 需要显式拷贝/移动已存在对象
- 兼容C++11前标准的老代码
推荐emplace_back的情况:
- 构造参数较多或构造过程复杂
- 需要优化性能的关键代码段
- 处理不可拷贝/移动的对象
4. 线程安全
- 两者都不是线程安全的
- 多线程操作需自行加锁同步
5. 选择策略
- 默认首选emplace_back(C++11及以上)
- 简单数据类型(int/char等)无需纠结选择
- 需要明确表达拷贝语义时使用push_back