【发布时间】:2012-10-04 07:40:14
【问题描述】:
似乎用memcpy 复制值是不安全的,除非该类型是可简单复制的,即满足std::is_trivially_copyable 类型特征。我想知道std::is_trivially_copy_assignable、std::is_trivially_copy_constructible、std::is_trivially_move_assignable 和std::is_trivially_move_constructible 类型特征的目的是什么,如果您不能利用它们进行初始化或使用memcpy 赋值。它们是否允许进行其他优化?
我还想知道为什么标准需要一个简单的析构函数才能使用memcpy 复制值。 (一个微不足道的析构函数确实简化了在内存中物理移动值的过程,但对于使用memcpy 复制一个值似乎不是根本必需的)。
【问题讨论】:
-
想象析构函数做了一些工作(任何事情)。如果你只是复制(按位),那么你知道有两个对象在它们的析构函数运行时会完成这项工作。显然,该类型应该有一个重要的复制构造函数开始,但是这个对析构函数的检查可以看作是最后的手段:)
-
如果你真的想复制一个值,那么你会期望析构函数最终运行两次。此外,如果您手动管理分配和释放,例如在容器类中,您可以在释放或重用内存之前省略对原始值的析构函数调用。
标签: c++ c++11 memcpy typetraits