欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
 

这种写法毫无疑问直接原地构造,没有拷贝和移动运行效率更快

相关标签: c++