#6 在向 vector 插入元素的时候使用 emplace_back() 而不是 push_back()。
几乎赶上 C++11 潮流的每个人都明确地认同“安置”这种往 STL 容器里插入元素的方法。理论上来说,“安置”更有效率。然而所有实践都表明,有时候性能差异甚至可以忽略不计。
思考下面的代码:
vector<BigTestStruct> sourceVector4, pushBackTestVector, emplaceBackTestVector;
FillVector(sourceVector4);
//Test push back performance
();
for (unsigned i = 0; i < (); ++i)
{
pushBackTestVector.push_back(sourceVector4[i]);
}
cout << "Using push_back :" << () << endl;
//Test emplace_back()
();
for (unsigned i = 0; i < (); ++i)
{
emplaceBackTestVector.emplace_back(sourceVector4[i]);
}
cout << "Using emplace_back :" << () << endl;
如果运行100次,会得到这样的输出:
Average Using push_back :5431.58
Average Using emplace_back :5254.64
可以清楚的看到,“安置”函数比插入函数性能更好 – 但只有 177 微秒的差距。在所有情况下,他们大致是相当的。
仅在以下情况下,Emplacement 函数可能会更快:
-
要添加的值是在 vector 中构造的,而不是赋值的。
-
传递的参数类型与 vector 中保存的类型不同。例如,如果一个向量包含 std :: string,但我们传递一个字符串值到该 vector。
即使上述两个条件都不成立,如本例所示的,你也不要因为在插入时使用 emplacement 而掉以轻心。
更多关于 emplacement vs. insertion 的详细信息,请查看 Scott Meyer 的“Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14“一书中的条目#42。
结语
与任何第三方统计数据一样,你不应盲目地依赖此处提供的结果和建议。在不同的操作系统、处理器体系结构和编译器设置上测试时,你可能遇到很多不确定因素。因此,你需要根据实际数据,自己做出衡量。