You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++17中std::vector<std::string>push_back字符串字面量:复制/移动?push_back与emplace_back效率对比

C++17中vector::push_back字符串字面量的行为与效率对比

一、字符串字面量"abc"的处理逻辑

字符串字面量"abc"是const char*类型,调用push_back时,首先会用它构造一个临时的std::string对象。在C++17中,这个临时对象属于纯右值,会触发std::vector<std::string>::push_back的右值引用重载版本,最终通过移动构造将临时对象的资源转移到vector的元素中,而不是进行复制操作。

移动std::string本质只是转移内部的指针、长度等元数据,不会复制实际的字符数组,开销极低。

二、push_back与emplace_back的效率对比

在这个场景下,两者的效率几乎没有差异:

  • emplace_back的逻辑是直接在vector预留的内存空间中,调用std::string的构造函数(以const char*为参数)完成对象构造,全程没有临时对象和移动操作。
  • push_back会先构造临时std::string,再通过移动构造将资源转移到vector中。但std::string的移动构造是O(1)的轻量操作,而且C++17的编译器通常会优化掉这个临时对象的移动,最终实际执行的逻辑和emplace_back几乎一致。

如果非要较真的话,emplace_back理论上少了一次移动构造的步骤,但实际运行中两者的性能表现完全可以视为等价。


内容的提问来源于stack exchange,提问作者codeology

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:20:01