【问题标题】:Not fully understanding this part of code没有完全理解这部分代码
【发布时间】:2023-11-09 23:11:01
【问题描述】:

我最近遇到了这段代码,我无法理解它。有人可以解释一下那里发生了什么吗?

union Color32
{
   struct ARGB
   {
      uint8_t b;
      uint8_t g;
      uint8_t r;
      uint8_t a;
   } parts;
   uint32_t argb;
   Color32() : argb(0) {}
   Color32(uint32_t c_argb) : argb(c_argb) {}
   Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
   {
       parts.a=a;
       parts.r=r;
       parts.g=g;
       parts.b=b;
   }
};

【问题讨论】:

标签: c++ data-structures struct unions


【解决方案1】:

union 的成员共享存储。这与 struct 不同,其中每个成员都分配有不同的存储空间。

这段代码的效果是ARGB结构体的成员b,g,raColor32union的另一个成员argb共享存储.

因此,设置argb 值的构造函数隐式设置bgra 的值作为argb 位模式的有序部分。

相反,b,g,r & a 构造函数构建了 argb 的值。

“ARGB”下的图表很好地展示了这些部分是如何“打包”到 32 位块中的。

http://en.wikipedia.org/wiki/RGBA_color_space

我可能不需要解释 b 代表蓝色,ggreen ,r 代表红色,a 代表 alpha(AKA 透明度)!

如果需要大端/小端可移植性,您可能会遇到困难。

【讨论】:

    【解决方案2】:

    ARGB 是 4 个 uint 的结构,分别代表绿色、蓝色、红色和我不知道的。 该结构是使用名称部件创建的,因此当您必须使用它时,您必须执行如下操作:parts.r = 20 或 parts.g = 50。

    然后它创建一个可以包含 argb 的 4 个参数 (4*8 = 32) 的对象颜色。

    它使用您给他的 4 个参数初始化对象颜色 32:a,b,c,d

    Color32(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
       {
       parts.a=a;
       parts.r=r;
       parts.g=g;
       parts.b=b;
       }
    

    要恢复,您有一个名为 Color of 32 位的对象,其中包含来自结构部分的 4 个 8 位对象。

    【讨论】: