JDK动态代理 程序栈 二代征信 express d3 grails graphics rspec get Browserify Movejs 大数据驾驶舱 excel太长的文字隐藏 jquery关闭当前窗口 matlab跳出for循环 matlab取绝对值 python的array java数组反转 java搭建 java字符 sql行转列 pr黑场过渡 firework下载 无限视距 源计划艾克 mac强制重启 图片转pdf免费软件 java表白代码 磁芯大战 掘地鼠炖肉 字符串分割 mysql关联查询 思源字体打包 winrar去广告版 怎么用打印机扫描文件 vc运行库 sd卡格式化 wow显示伤害数字 1474是ipad几 phonetic函数
当前位置: 首页 > 学习教程  > 编程语言

转载 emplace_back 与 push_back的区别

2020/9/19 13:43:07 文章标签:

https://blog.csdn.net/p942005405/article/details/84764104
评论区:

上面的所有结论都是基于什么得到的?真是武断!!STL的实现版本很多,VS、GCC版本不同,实现都不同,建议翻看STL源代码。 新版本的原型展示: void push_back(const value_type& x); void push_back(value_type&& x); <typename… Args> reference emplace_back(Args&&… args); 两者区别:push_back传入一个事先存在的元素对象,调用的是拷贝或移动构造来生成这个新压入的元素对象:construct(*des, class_name&|&& x)) emplace_back:多个事先存在的对象,调用示义:construct(*des, other_type &x|&&x, type_name &|&&,…) emplace_back传参不定,编译器需要在调用时才生成具体的实现,push_back只是emplace_back的两个偏移化版本! push_back只能用类中的拷贝或移动构造,而emplace_back还可以是类中的其他多参数的构造函数,这是优点也是缺点(代码翻倍)&&在普通函数中作为参数时,是万能引用,并不是右值引用,在函数体中会使用forward完美转发,调用时是复制或移动和你传的值有关,你传左值它就用左值版本,传右值就用右值版本,心里要有数。如果一个类没有上诉的拷贝或移动构造,则不能用于STL容器中,如果没有相应参数类型的构造实现,emplace_back编译不过,找不到它需要的对应构造函数… move和copy构造唯一区别:move时,指针属性只是简单的拷贝指针,而copy中,指针属性被拷贝的同时,它所指的具体内容也还需要深度copy下去…我们在实现类的两个构造时特别要注意这一点,move中要将旧对象的指针属性置nullptr,这意味着相应的对象不再适合使用了(它必须是临时对象的原因!转移后,内部的指针属性失效!) move和copy的性能对比:正如上说,move只是指针优化,如果类本身没有指针属性,则它不需要move,我们也不必强制move不可,copy和move在内置类型和简单类型(指无指针属性、即构造时不需要new)没区别4


本文链接: http://www.dtmao.cc/news_show_200060.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?