类 的 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)
参考: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)