gpt4 book ai didi

c++ - uint32_t 和 uint8_t[4] 未定义行为的 union ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:39 26 4
gpt4 key购买 nike

<分区>

this answer的评论中据说使用如下 union 将整数拆分为字节是未定义的行为。那个地方给出的代码与此类似但不完全相同,如果我更改了代码的未定义行为相关方面,请注明。

union addr {
uint8_t addr8[4];
uint32_t addr32;
};

到目前为止,我认为这是一种很好的方法来执行 addr = {127, 0, 0, 1}; 并在中获取相应的 uint32_t返回。 (我承认这可能会产生不同的结果,具体取决于我的系统的字节序。但是问题仍然存在。)

这是未定义的行为吗?如果是这样,为什么? (我不知道什么意思什么是 C++ 中的 UB 是访问非事件 union 成员。)


C99

  • 在这一点上,C99 显然非常接近 C++03。

C++03

  • 在一个 union 体中,任何时候至多有一个数据成员是事件的,即任何时候最多有一个数据成员的值可以存储在一个 union 体中。 C++03,第 9.5 (1) 节,第 162 页

不过

  • 如果一个 POD union 体包含多个共享公共(public)初始序列的 POD 结构 [...],则允许​​检查任何 POD 结构成员的公共(public)初始序列 同上。
  • 如果两个 POD-struct [...] 类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按顺序)具有布局兼容的类型,则它们是布局兼容的 C++03,第 9.2 (14) 节,第 157 页
  • 如果两个类型 T1 和 T2 是同一类型,则 T1 和 T2 是布局兼容类型。 C++03,第 3.9 (11) 节,第 53 页

结论

  • 因为 uint8_t[4]uint32_t 不是同一类型(我猜是 strict aliasing thing )(加上两者都不是 POD 结构/union )以上确实是UB?

C++11

  • 请注意,聚合类型不包括 union 类型,因为具有 union 类型的对象一次只能包含一个成员。 C++11,脚注 46,第 42 页

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