近日在YouTube视频上看到关于vector中emplace_back与push_back区别的先容,深感本身在现代C++中照旧有不少遗漏的知识点,遂写了段代码,实验比力两者的差异。
示例代码- <code>#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); });
- }</code>
复制代码运行结果- <code>Constructor: push_back
- Copy Consturctor: push_back
- Constructor: emplace_back
- 0.431
- 0.28</code>
复制代码结论
- emplace_back方法可以不调用拷贝构造函数,所以理论上它应该比push_back性能更好
- 经过10W次量级的数据盘算,最闭幕果与预期一致
- reserve方法必须要使用,可以镌汰分配内存时间,提升性能
来源:https://www.cnblogs.com/kenwoo/p/11689284.html |