首页 > 后端开发 > C++ > 'memcpy”是在 C 中构造可简单复制对象的有效方法吗?

'memcpy”是在 C 中构造可简单复制对象的有效方法吗?

Patricia Arquette
发布: 2024-11-09 17:39:02
原创
970 人浏览过

Is

使用“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, &amp;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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板