我可以 memcpy() 任何具有微不足道析构函数的类型吗?

Can I memcpy() any type which has a trivial destructor?

本文关键字:析构函数 类型 微不足道 memcpy 任何具 我可以      更新时间:2023-10-16

确实意识到is_pod是类型memcpy的充分条件,但has_trivial_destructor足以达到此目的吗?如果没有,为什么?

No.要求是类型是简单可复制的 (§3.9/2),这还有一些要求,例如缺少非平凡的复制构造函数 (§9/6)。

一个平凡可复制的类是一个类:

— 没有重要的复制构造函数 (12.8),

— 没有不平凡的移动构造函数 (12.8),

— 没有重要的复制赋值运算符 (13.5.3, 12.8),

— 没有重要的移动赋值运算符(13.5.3、12.8),并且

— 有一个微不足道的析构函数 (12.4)。

所以你应该改用is_trivially_copyable

一个对象有一个简单的析构函数是不够的。它还需要具有简单的复制操作。例如,对象可以维护指向内部缓冲区的指针。无需销毁任何内容,但复制需要在复制到对象中设置指针,否则它们将指向源对象的缓冲区。

尽管在实践中通常很少见,但可能存在类具有非平凡复制构造函数以及普通析构函数的情况。 考虑一个具有静态成员变量的类,该变量仅计算该类被复制的次数。 如果您memcpy它,计数器将不准确。

在我看来

,带有纯指针的类有资格成为has_trivial_destructor,但您通常希望制作一个深拷贝,而memcpy会创建一个浅拷贝。

相关文章: