在C ++ 11中,您可以将std::vector::push_back
与std::move
结合使用,以避免在将元素插入向量时复制。标准中是否有一节禁止编译器自动使用调用std::move
后未使用的局部变量push_back
?当填充具有大元素的向量时,这可以带来巨大的性能益处。
我使用gcc 7.1.0和-O3
检查了以下代码,使用版本1打印move
,而版本2打印copy
。
#include <iostream>
#include <string>
#include <vector>
struct S
{
S() = default;
S(S const&) { std::cout << "copy" << std::endl; }
S(S &&) { std::cout << "move" << std::endl; }
std::string a;
std::string b;
};
void fill_members(S& s) { /*...*/ }
int main()
{
std::vector<S> v;
{
S s;
// Somehow fill members of s, maybe use a function call for that.
fill_members(s);
// Version 1:
// This avoids a copy, since there is an explicit std::move.
v.push_back(std::move(s));
// Version 2:
// Why dont compilers optimize this with std::move?
// The compiler can see that s is not used after this line.
v.push_back(s);
}
}