类 的 memcpy 数组重新访问

memcpy array of classes revisit

参考:Can I use memcpy in C++ to copy classes that have no pointers or virtual functions

上述线程引发了围绕直接 memcpying 非 std::is_pod(普通旧数据)structs/classes 的可行性的风暴,但是,std::is_trivially_copyable 是否足以允许 memcpy 类?

的数组

这意味着您可以拥有私有成员、用户定义的构造函数等而不会导致 UB。

MyClass Array1[10];
MyClass Array2[10];

static_assert(std::is_trivially_copyable<MyClass >::value, "memcpy not safe");

memcpy(Array1,Array2,10 * sizeof(MyClass));

isn't std::is_trivially_copyable sufficient to allow the memcpy of an array of classes?

是的,足够了。你的例子没有UB。

也就是说,您不一定需要限制自己使用 std::memcpy,因为您可以改用 std::copy_n(或 std::copy),这将适用于所有可复制类型,而不仅仅是琐碎的类型:

static_assert(std::size(Array1) >= std::size(Array2));
// no need for asserting for triviality
std::copy_n(Array2, std::size(Array2), Array1);

或者,如果将数组包装在 class 中,则可以使用赋值。标准库有一个用于此类数组包装器的模板:

std::array<MyClass, 10> Array1;
std::array<MyClass, 10> Array2;
Array1 = Array2;

如果您期望 std::memcpy 更快,则无需担心。一个体面的优化器将产生相同的输出,也可能内联对 memcpy 的调用:https://godbolt.org/z/nEvGMe


P.S。我推荐 sizeof Array1.

而不是硬编码 10 * sizeof(MyClass)