emplace_back似乎可以不用move就能实现

pqepqeisd 2015-11-25 11:01:51
stl容器的emplace_back比push_back而言,用move语义来移动一个元素,而不是拷贝一个元素,所以效率可以更高。我看gcc的源码,push_back(T&&)也是内部用emplace_back一个move过的元素

问题:
但是这样做是为了效率考虑的话,我感觉placement_new的效率更高啊,容器先reserve(),然后以reserve出来的空间作为地址,做new()来构造一个新的元素,这样一来连move都省掉了,岂不是更好。
感觉emplace_back需要依赖move语义,有点多次一举的意思啊
...全文
258 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2015-11-26
  • 打赏
  • 举报
回复
emplace_back 后的参数只是构造函数中需要的参数,对象直接在需要的位置构造 push_back 后的参数是一个对象,所以是拷贝进去的 VS上emplace_back 后可跟的参数好像不能超过5个(其他STL不知)
D41D8CD98F 2015-11-26
  • 打赏
  • 举报
回复
引用 楼主 pqepqeisd 的回复:
stl容器的emplace_back比push_back而言,用move语义来移动一个元素,而不是拷贝一个元素,所以效率可以更高
这句本来就是错的。楼主能否给出这句的来源?
paschen 版主 2015-11-26
  • 打赏
  • 举报
回复
引用 3 楼 fefe82 的回复:
[quote=引用 2 楼 paschen 的回复:] emplace_back 后的参数只是构造函数中需要的参数,对象直接在需要的位置构造 push_back 后的参数是一个对象,所以是拷贝进去的 VS上emplace_back 后可跟的参数好像不能超过5个(其他STL不知)
支持 C++11 的应该都可以接受任意个。VS2015 应该也可以(没试过)。[/quote] 你说得对,VS2015是支持的,不过VS2012上还不支持
fefe82 2015-11-26
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
emplace_back 后的参数只是构造函数中需要的参数,对象直接在需要的位置构造 push_back 后的参数是一个对象,所以是拷贝进去的 VS上emplace_back 后可跟的参数好像不能超过5个(其他STL不知)
支持 C++11 的应该都可以接受任意个。VS2015 应该也可以(没试过)。
fefe82 2015-11-25
  • 打赏
  • 举报
回复 1
emplace_back 实现的就是类似 placement_new 的语义。你是将构造函数的参数传进去,原地构造一个对象。 如果穿一个类对象进去,当然就只能拷贝(或move)构造了。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧