zoukankan      html  css  js  c++  java
  • 编程杂谈——使用emplace_back取代push_back

    近日在YouTube视频上看到关于vector中emplace_back与push_back区别的介绍,深感自己在现代C++中还是有不少遗漏的知识点,遂写了段代码,尝试比较两者的差别。

    示例代码

    #include <iostream>
    #include <vector>
    #include <functional>
    #include <chrono>
    
    class Item
    {
    public:
    	Item(std::string name, bool display = true):name(name), display(display)
    	{
    		if (display)
    			std::cout << "Constructor: " << name << std::endl;
    	}
    
    	Item(const Item& item):name(item.name), display(item.display)
    	{
    		if (item.display)
    			std::cout << "Copy Consturctor: " << item.name << std::endl;
    	}
    private:
    	std::string name;
    	bool display;
    };
    
    void calculate(std::vector<Item>& v, int count, std::function<void()> const& f)
    {
    	clock_t begin_time = clock();
    	for (auto i = 0; i < count; i++)
    	{
    		f();
    	}
    
    	std::cout << float(clock() - begin_time) / CLOCKS_PER_SEC << std::endl;
    }
    
    int main()
    {
    	std::vector<Item> v;
    	v.reserve(2);
    
    	v.push_back(Item("push_back"));
    	v.emplace_back("emplace_back", true);
    
    	v.clear();
    
    	int count = 100000;
    	v.reserve(count);
    
    	calculate(v, count, [&]() { v.push_back(Item("push_back", false)); });
    
    	v.clear();
    
    	calculate(v, count, [&]() { v.emplace_back("emplace_back", false); });
    }
    

    运行结果

    Constructor: push_back
    Copy Consturctor: push_back
    Constructor: emplace_back
    0.431
    0.28
    

    结论

    • emplace_back方法可以不调用拷贝构造函数,所以理论上它应该比push_back性能更好
    • 经过10W次量级的数据计算,最终结果与预期一致
    • reserve方法必须要使用,可以减少分配内存时间,提升性能
  • 相关阅读:
    Android中颜色的使用
    Android中android:layout_weight的使用方法
    Android中android:layout_gravity和android:gravity的使用方法
    Android中的尺寸单位
    一个小demo
    新版markdown解析工具
    LoadShader辅助函数
    github 博客地址
    不一样的快速排序
    C++ 重构 markdown–> HTML 的引擎
  • 原文地址:https://www.cnblogs.com/kenwoo/p/11689284.html
Copyright © 2011-2022 走看看