1

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

4

2 回答 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 回答