在C ++ 11移动语义之前,如果你有一个需要重新分配的缓冲区,例如在std :: vector实现中,对push_back的调用会导致重新分配,那么只需memcpy旧的就可以了将内容缓冲到新缓冲区中,还是应该遍历旧缓冲区并将每个元素复制构造到新缓冲区中?
答案 0 :(得分:4)
使用std::copy
,它应该像编译器编写者一样完全优化。
答案 1 :(得分:3)
移动语义不会神奇地使对象memcpy
能够。例如:
struct S {
S(int ii) : i(ii), ip(&i) { }
int i;
int *ip; // points to i
};
复制或移动此类对象时,副本中ip
的值不能是原始对象的值;必须将其更改为指向新对象的i
成员。 memcpy
将不来做到这一点;它会将旧地址复制到新对象中,结果将是无意义的。复制构造函数和移动构造函数必须正确设置ip
。
正如@markransom所说,使用std::copy
。它将使语义正确;特别是,对于可以memcpy
复制的类型,它(通常)会这样做。