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

直接使用内存构造对象,和生成副本后移动相比,在性能开销上会有很大提升。这就是原位构造的优势。
更多推荐



所有评论(0)