c++中STL的push_back和emplace_back的区别
程序员文章站
2022-03-21 14:34:00
...
这两个函数其实是我写c++中经常用的。在这里再次回顾一下
我非常喜欢c++,因为他的变化莫测,c++想写出高性能的程序,必须要减少内存拷贝,而我们经常用的stl,需要我们了解他们细致的区别 ,首先声明一个类,让我们看一下调用push_back和emplace_back哪些会触发拷贝构造函数,哪些可以出发移动构造函数,从而来了解他们的区别
声明一个类A
class A {
public:
A (const A& cop) {
std::cout << "copy" << std::endl;
}
A (A&& cop) {
std::cout << "move" << std::endl;
}
A(int data) {
std::cout << "A __construct" << std::endl;
a = data;
}
~A() {
std::cout << "~A:" << a << std::endl;
}
int a;
};
然后我们写一个demo看看运行结果
std::list<A> dd;
A b(2);
dd.push_back(b);
dd.emplace_back(b);
这两种写法都触发了拷贝构造函数,也就是说对象值拷贝给了一个临时变量,然后写入list
A __construct
copy
copy
然后我们再换一种写法
/home/zhanglei/ourc/test/cmake-build-debug/cppTest
A __construct
move
move
这样其实性能会更好,只会触发移动构造函数,会提高运行性能
,但是我们把emplace_back换一种写法
{
std::list<A> dd;
dd.emplace_back(2);
sleep(10);
std::cout << "sleep end" << std::endl;
}
运行结果是
/home/zhanglei/ourc/test/cmake-build-debug/cppTest
A __construct
Process finished with exit code 15
这种写法毫无疑问直接原地构造,没有拷贝和移动运行效率更快
推荐阅读
-
javascript中apply、call和bind的使用区别
-
JavaScript中的toString()和toLocaleString()方法的区别
-
Oracle中sys和system的区别小结
-
浅析PHP中strlen和mb_strlen的区别
-
Yii中render和renderPartial的区别
-
jQuery中两种遍历$.each()和$().each()的区别
-
JS中的位置和宽度:clientWidth、offsetWidth、scrollWidth等区别介绍
-
Python中is和==的区别详解
-
ubuntu系统中/etc/rc.local和/etc/init.d/rc.local的区别详解
-
详解nodejs中exports和module.exports的区别