【发布时间】:2018-12-26 10:51:18
【问题描述】:
我使用联合来表示 rgb 像素数据,因此可以将其作为uint8_t 的连续数组或作为单个 rgb 元素进行访问。 (我认为这可能是工会的少数用途之一。)
类似这样的:
union PixelRGB
{
uint8_t array[3];
struct rgb
{
uint8_t b;
uint8_t g;
uint8_t r;
};
};
我实际上是从网上的其他地方找到这段代码的,这表明这是一种潜在的用途。
几分钟前我问了一个关于另一个问题的问题,但被告知我的工会可能会产生 UB。
我已经阅读了this,它似乎表明如果我从一个不是最后一个要写入的成员中读取,那么结果是 UB...
我的问题是为什么?
我的假设(也许是错误的?)是在内存中联合将被表示为:
b = array[0]
g = array[1]
r = array[2]
即;这些变量中的每一个都在内存中占用完全相同的字节(空间/位置/地址),因此我假设该行
g = 0xff;
会将array[1] 的值更改为0xff。
我错了吗?为什么?
为了论证:C++ 14
重复的问题不是重复的:链接的问题询问联合内的两个结构是否是 UB - 不是我在这里问的。
【问题讨论】:
-
我今天已经多次看到这个确切的结构。这个问题与您的其他问题有何不同?
-
而 C++ 不允许 type-punning 使用联合。
-
这里的有趣点:你声明了一个类型,嵌套在联合体中,但联合体不包含该声明类型的子对象!
标签: c++ undefined-behavior unions