C 中,使用 push_back() 函數 和 emplace_back() 函數都可以用來給容器添加元素。
其中,emplace_back() 函數是 C 11 新增加的,其功能和 push_back() 相同,都是在容器尾部添加一個元素。
事實上,emplace_back() 和 push_back() 在底層實現機制上是不同的。
push_back() 在向容器尾部添加元素時,會先創建這個元素,然后再將這個元素拷貝或移動到容器中(若是拷貝的話,還需要在結束后銷毀之前創建的這個元素);
emplace_back() 則是直接在容器尾部創建這個元素,省去了拷貝或移動元素的過程。
如下圖所示,
從上圖可以看出,push_back 比 emplace_back 多了一步移動構造。若將移動構造函數注釋掉,則結果為:
這時 push_back 比 emplace_back 多了一步拷貝構造。由此可以看出,push_back() 在底層實現時,會優先選擇調用移動構造函數,如果沒有才會調用拷貝構造函數。
從上面可以看出,push_back() 的底層實現過程比 emplace_back() 更繁瑣,換句話說,emplace_back() 的執行效率要比 push_back() 高。
因此,在實際工作中,應優先使用 emplace_back() 函數。