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