使用“memcpy”构造普通可复制对象时的担忧
在 C 语言中,使用“memcpy”构造普通可复制对象的有效性可复制类型一直是争论的话题。本文探讨了围绕此代码的细微差别和不确定性:
#include <cstdlib> #include <cstring> struct T // trivially copyable type { int x, y; }; int main() { void *buf = std::malloc( sizeof(T) ); if ( !buf ) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Uncertain Object Lifetime with "memcpy""
问题的关键在于确定是否“ *b" 表示一个对象,其生命周期已启动,如果是,则该生命周期何时开始。C 标准对此保持沉默
隐式对象创建和当前状态的提案
为了解决这个歧义,提出了提案p0593,提倡在低级对象操作期间隐式对象创建诸如“malloc”和“memcpy”之类的操作。此提议的更改将为此类场景提供定义的行为。但是,此提议尚未正式发布。已审查。
C 14 标准草案的指南
根据 C 14 标准草案第 1.8 节 [intro.object],对象主要通过定义、新创建-表达式,或某些实现过程,与普通可复制类型相关的第 3.9 节指定复制此类对象的字节。是允许的,前提是这些值得到了适当的恢复。
正在进行的讨论和替代方法
“ub 邮件列表”促进了对此主题的热烈讨论,重点关注关于避免通过类型复制双关语。
结论
使用“memcpy”“构造”可简单复制的对象的问题在 C 标准中仍未解决,为潜在的未定义行为留下了空间。正在进行的讨论和提案,例如 p0593,旨在澄清和解决这个问题,为 C 中的低级对象操作带来更大的确定性。
以上是'memcpy”是在 C 中构造可简单复制对象的有效方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!