在 C++11 移动语义之前,如果您有一个需要重新分配的缓冲区,例如在 std::vector 实现中调用 push_back 会导致重新分配,是否可以将旧缓冲区内容 memcpy 到新缓冲区,还是应该遍历旧缓冲区并将每个元素复制构造到新缓冲区中?
问问题
163 次
2 回答
4
使用std::copy
,它应该在编译器作者允许的情况下尽可能完全地优化。
于 2013-09-05T15:24:36.357 回答
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
它复制的类型(通常)会这样做。
于 2013-09-05T15:33:10.983 回答