gpt4 book ai didi

c++ - 在整个 union 上使用 std::memcpy 是否保证保留事件的 union 成员?

转载 作者:行者123 更新时间:2023-12-01 14:07:04 24 4
gpt4 key购买 nike

在 C++ 中,从最近编写的 union 成员(即事件 union 成员)中读取是明确定义的。

我的问题是是否std::memcpy将整个 union 对象复制到未初始化的内存区域,而不是将特定 union 成员复制到未初始化的内存区域将保留事件 union 成员。

union A {
int x;
char y[4];
};

A a;
a.y[0] = 'U';
a.y[1] = 'B';
a.y[2] = '?';
a.y[3] = '\0';

std::byte buf[sizeof(A)];
std::memcpy(buf, &a, sizeof(A));

A& a2 = *reinterpret_cast<A*>(buf);

std::cout << a2.y << '\n'; // is `A::y` the active member of `a2`?

最佳答案

你的作业没问题,因为 the assignment to non-class member a.y "begins its lifetime" .但是,您的 std::memcpy不这样做,所以对 a2 的成员的任何访问无效。因此,您依赖于未定义行为的后果。从技术上讲。在实践中,大多数工具链对原始类型 union 成员的别名和生命周期都相当宽松。

不幸的是,这里有更多的 UB,因为您违反了 union 本身的别名:您可以假装 T是一堆字节,但是 you can't pretend that a bunch of bytes is a T ,不管多少reinterpret_cast你做的。你可以实例化一个 A a2通常和 std::copy/std::memcpy来自 a ,然后你就回到了 union 成员的终身问题,如果你关心的话。但是,我想,如果这个选项对你开放,你只会写 A a2 = a首先…

关于c++ - 在整个 union 上使用 std::memcpy 是否保证保留事件的 union 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62253409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com