C++中emplace_back的原理分析

C++中emplace_back的原理分析 emplace_back 的原理首先 emplace_back() 是一个变参模板函数函数接口如下面的形式templatetypename... Args reference emplace_back(Args... args);同样的我们只要把上面实例代码的 push_back() 接口改为 emplace_back()也能达到同样的效果。#include string #include vector int main() { std::vectorstd::string arr; arr.emplace_back(Hello World); }那这两者的区别到底在哪里呢这就要提到本文一开始就给出的关键词原位构造。在软件程序中内存是至关重要的概念。几乎所有数据都依附于内存而内存本身是不在乎上层对它的使用的。比如在 0x123456 的地址中向后给出的 1000byte 大小的内存。这块内存可以存一堆 int一堆 double甚至是一堆 std::string。而这一切都是依于上层对它的表示。回到 vector 中在不考虑扩容状态下数据的尾部会有一块未使用的内存而 emplace_back() 可以直接在这块内存中直接构造对象。下图展示了对于 push_back() 和 emplace_back() 的区别。直接使用内存构造对象和生成副本后移动相比在性能开销上会有很大提升。这就是原位构造的优势。