3

unions在存储一些信息(如一系列字节)并能够一次或一个接一个地访问它们时,使用它们有什么缺点。

示例:颜色可以用 RGBA 表示。所以颜色类型可以定义为,

typedef unsigned int RGBAColor;

然后我们可以使用位的“移位和屏蔽”来“检索或设置”RGBAColor 对象的红色、绿色、蓝色、alpha 值(就像在 Direct3D 函数中使用宏函数完成的一样,例如D3DCOLOR_ARGB())。

但是如果我使用联合呢?

union RGBAColor
{
unsigned int Color;
struct RGBAColorComponents
{
    unsigned char Red;
    unsigned char Green;
    unsigned char Blue;
    unsigned char Alpha;
} Component;
};

这样我就不需要总是为读取或写入颜色分量进行移位 ( <<) 或屏蔽 ( )。&但这有问题吗?(我怀疑这有一些问题,因为我没有看到任何人使用这种方法。)

字节序可以成为一个问题吗?如果我们总是Component用于访问颜色组件并Color用于访问整个事物(用于复制、分配等),那么字节序应该不是问题,对吧?

-- 编辑 -- 我发现一个旧帖子是同样的问题。所以我想这个问题有点转贴:P 抱歉。这是链接:在 C++ 中使用联合是一个好习惯吗?

根据答案,对于给定示例,联合使用似乎在 C++ 中是可以的。因为那里没有数据类型的变化,它只是访问相同数据的两种方式。如果我错了,请纠正我。谢谢。:)

4

2 回答 2

2

联合的这种用法在 C++ 中是非法的,其中联合包含重叠但互斥的对象。你不能写一个工会的成员,然后读出另一个成员。

在 C 语言中这是合法的,这是推荐的类型双关语方式。

这与(严格)别名的问题有关,这是编译器在尝试确定具有不同类型的两个对象是否不同时面临的困难。语言标准不同意,因为专家仍在研究可以在不牺牲性能的情况下安全地提供哪些保证。就个人而言,我避免所有这些。int实际将用于什么?翻译的安全方法是复制字节,如 by memcpy

还有字节顺序问题,但这是否重要取决于您想对int.

于 2013-02-07T07:17:41.690 回答
0

我相信使用联合可以解决与字节顺序相关的任何问题,因为 RGBA 顺序很可能是在网络顺序中定义的。此外,每个组件将是 uint8_t 或类似的事实,可以帮助一些编译器使用符号/零扩展加载,将低 8 位直接存储到非对齐字节指针,甚至能够并行化一些字节操作(例如 arm 有一些打包的4x8 位指令)。

于 2013-02-07T07:14:50.533 回答