emplace_back 比设置索引快吗?

404*_*und 0 c++ optimization vector

哪个会更快?

std::vector< std::string > vec;
vec.reserve(10);
for (int i=0; i < 10; i++){
    vec.emplace_back("Some text");
}
Run Code Online (Sandbox Code Playgroud)

或者

std::vector< std::string > vec;
vec.resize(10);
for (int i=0; i < 10; i++){
    vec[i] = "Some Text";
}
Run Code Online (Sandbox Code Playgroud)

如果其中一个比另一个更快(大小为 10),哪一个更具可扩展性?

rus*_*tyx 5

这将取决于平台、编译器和编译标志。

  • emplace_back版本size每次都需要增加向量。
  • 索引版本必须创建空字符串对象来预填充向量。

因此,如果不分析生成的代码和/或测量它,就无法判断。

根据google benchmark,该emplace_back版本更快:

GCC 10.2 -O3emplace_back稍微快一点:

在此处输入图片说明

Clang 11 -O3emplace_back快得多:

在此处输入图片说明

MSVC 19.6 /O2emplace_back稍微快一点:

-----------------------------------------------------
Benchmark           Time             CPU   Iterations
-----------------------------------------------------
Emplace           138 ns          136 ns      4480000
Index             159 ns          160 ns      4977778
Run Code Online (Sandbox Code Playgroud)