【发布时间】:2014-11-19 04:49:42
【问题描述】:
我的问题如下:
如果我想复制一个类类型,memcpy 可以很快完成。这在某些情况下是允许的。
我们有一些类型特征:
- is_standard_layout。
- is_trivially_copyable。
我想知道的是当类型“可按位复制”时的确切要求。
我的结论是,如果 is_trivally_copyable 和 is_standard_layout 特征都为真,则类型是可按位复制的:
- 这正是我需要按位复制的吗?
- 是否过度约束?
- 约束不足吗?
P.S.:当然,memcpy 的结果一定是正确的。我知道我可以在任何情况下进行 memcpy,但不正确。
【问题讨论】:
-
赋值运算符的复制速度也一样快,你知道的。作为奖励,如果您将您的课程更改为非平凡可复制的,它仍然有效。
-
您是否真的需要使用
memcpy以除速度之外的某些特定原因?因为只需使用默认的复制 ctor/赋值运算符,您就可以从编译器获得相同的速度,同时保持类型安全。对于普通可复制类型,即使是非常高级别的东西,例如在普通可复制类型的数组上的std::copy,也会被优化为单个memcpy。 -
只是为了了解内部工作原理。
-
默认副本比
memcpy function快是很常见的,因为它可以跳过所有类型的错位检查。这就是为什么编译器经常将memcpy实现为内在函数,以使其与默认的复制构造函数一样快。 -
@NicuStiurca:我来到这里是因为我需要一个用于存放任意此类数据的容器。通过使用 enabled if,我可以阻止人们构建无法以微不足道的方式复制的消息。