memcpy在缓冲区重新分配中是否正常?

时间:2013-09-05 15:21:05

标签: c++ memory-management memcpy

在C ++ 11移动语义之前,如果你有一个需要重新分配的缓冲区,例如在std :: vector实现中,对push_back的调用会导致重新分配,那么只需memcpy旧的就可以了将内容缓冲到新缓冲区中,还是应该遍历旧缓冲区并将每个元素复制构造到新缓冲区中?

2 个答案:

答案 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复制的类型,它(通常)会这样做。