【底层机制】emplace_back 为什么引入?是什么?怎么实现的?怎么正确用?
C++底层机制推荐阅读
【C++基础知识】深入剖析C和C++在内存分配上的区别
【底层机制】【C++】vector 为什么等到满了才扩容而不是提前扩容?
【底层机制】malloc 在实现时为什么要对大小内存采取不同策略?
【底层机制】剖析 brk 和 sbrk的底层原理
【底层机制】为什么栈的内存分配比堆快?
【底层机制】右值引用是什么?为什么要引入右值引用?
【底层机制】auto 关键字的底层实现机制
【底层机制】std::unordered_map 扩容机制
【底层机制】稀疏文件–是什么、为什么、好在哪、实现机制
【底层机制】【编译器优化】RVO–返回值优化
【基础知识】仿函数与匿名函数对比
【底层机制】【C++】std::move 为什么引入?是什么?怎么实现的?怎么正确用?
【底层机制】emplace_back 为什么引入?是什么?怎么实现的?怎么正确用?
emplace_back
完美体现了C++“零开销抽象”哲学,能带来显著的性能提升和代码简洁性。请让我为你深入解析。
1. 历史背景:解决的痛点 (The “Why”)
在C++11之前,向容器(如 std::vector
)的末尾添加新元素,主要使用 push_back
。
push_back
的工作方式:
- 在容器外构造一个对象。
- 通过
push_back
将这个对象传递给容器。 - 容器在内部拷贝或移动这个对象,放入为自己管理的内存中。
这个过程在添加临时对象(右值)时效率尚可(触发移动语义),但在需要直接构造时,会产生不必要的开销:
// C++98/03 时代
std::vector<std::string> vec;// 场景1:添加一个临时对象(C++11后可以移动,开销小)
vec.push_back(std::string("Hello")); // 1. 构造临时string,2. 移动到vector中// 场景2:在容器内构造一个对象(开销大!)
vec.push_back("Hello"); // 错误!const char* 不能直接push_back
// 必须先在外面构造一个string
std::string temp_str("Hello"); // 1. 外部构造
vec.push_back(temp_str); // 2. 拷贝到vector中!性能损失!// 即使C++11有了移动语义,对于需要多个参数构造的对象也很麻烦
class MyClass {
public:MyClass(int a, double b