并集与位掩蔽和位移位

union vs bit masking and bit shifting

本文关键字:      更新时间:2023-10-16

在存储一些信息(如一系列字节)时,使用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来访问整个内容(用于复制、分配等。作为一个整体),则字节序应该不会成为问题,对吧?

--编辑--我发现了一个同样有问题的旧帖子。所以我想这个问题有点被转发了:对不起。链接如下:在C++中使用并集是一种好的做法吗?

根据答案,在C++中,对给定的例子使用并集似乎是可以的。因为其中没有数据类型的更改,所以只有两种方法可以访问相同的数据。如果我错了,请纠正我。谢谢。:)

在C++中使用并集是非法的,在C++中,并集包括重叠但互斥的对象。你不允许写一个工会的一个成员,然后宣读另一个成员。

这在C中是合法的,因为这是一种推荐的双关语类型。

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

还有一个endianness问题,但这是否重要取决于您想对int做什么。

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

相关文章:
  • 没有找到相关文章