【发布时间】:2019-05-03 07:49:51
【问题描述】:
以下代码将包含大向量的对象传递到向量中。我希望这是高性能的。在对push_back 的调用中,我是否需要将test 转换为右值?我是否需要告诉编译器如何移动 struct Test 的实例?还是这一切都会自动进行?
int main()
{
struct Test
{
std::vector<size_t> vals;
double sum;
};
std::vector<Test> vecOfTest;
vecOfTest.reserve(100000);
for (size_t i = 0; i < 100000; i++)
{
Test test{};
test.vals.reserve(i);
for (size_t j = 0; j < i; j++)
{
test.vals.push_back(j);
test.sum += j;
}
vecOfTest.push_back(test);
}
return 0;
}
【问题讨论】:
-
只要做
vecOfTest.emplace_back(std::move(test));,你应该会很好。编译器会为Test自动生成一个适当的移动构造函数,因为它的所有成员都是微不足道的或者有一个移动构造函数。 -
@Swordfish 标准不允许这样做,因此如果这导致可观察到的差异,则不允许编译器这样做。
-
@Swordfish 大多数编译器认为正常的内存分配是一种可观察到的副作用(涉及系统调用)。
-
@Swordfish msvc/gcc 不合理,那么呢?
-
@MaxLanghof 如果您推送或放置一个已经构建的对象,它不应该有任何的区别。如果您有
SomeClass sc(7, 10, 12); v.push_back(std::move(sc));与v.emplace_back(7, 10, 12),则临时保存。
标签: c++ c++11 move-semantics