是否有工会联盟这样的事情?

时间:2010-09-02 09:56:04

标签: c++ c

我遇到了以下代码 - col_8888的数据类型是什么?为什么它引用了union _colours?我用谷歌搜索了工会,但我找不到这种宣言的参考 - 它看起来好像col_8888是一个“工会联盟”?

union _colours {
    uint8  c[3][4];
    uint32 alignment;
};

static const union _colours col_8888 = 
{        
    {    /*   B     G     R     A  in memory     */
        {    0x00, 0x00, 0xFF, 0xFF, }, /* red   */
        {    0x00, 0xFF, 0x00, 0xFF, }, /* green */
        {    0xFF, 0x00, 0x00, 0xFF, }, /* blue  */
    }   
};

#define COL_8888_RED   *((uint32 *)&col_8888.c[0])
#define COL_8888_GREEN *((uint32 *)&col_8888.c[1])
#define COL_8888_BLUE  *((uint32 *)&col_8888.c[2])

2 个答案:

答案 0 :(得分:9)

col_8888的类型是union _colours,所以它不是工会联盟:它只是一个工会。在C中,必须在联合名称前加上union前缀才能使用它。或者,您可以使用typedef。因此,以下两个声明是等效的:

union _colours {
    uint8  c[3][4];
    uint32 alignment;
};

static const union _colours col_8888 =
...

/* Equivalent to: */

typedef union {
    uint8  c[3][4];
    uint32 alignment;
} _colours_t;

static const _colours_t col_8888 =
...

答案 1 :(得分:0)

我在SIMD类型的数学类(https://github.com/redorav/hlslpp)中使用了它。我设计的具有访问器的一种方法是使用与主类型联合的类组件。

如下所示:

class component1
{
    __m128 vec;
    component1(float f) { // Only write to one component }
}

class vec4
{
    union
    {    
        __m128 vec;
        component1 x;
        component1 y;
        component1 z;
        component1 w;
    }
}

此示例不完整,因为component1实际上是模板化的,其行为取决于您访问的组件,但对于此示例,它很好。

如果将其扩展到矩阵,则可以为每行指向相同数据的访问器。您可以扩展它以在matrix4中使用matrix3别名。

例如,

class mat3
{
    union
        {
             __m128 row1;
             component1 m00, m01, m02;
        }
        union
        {
             __m128 row2;
             component1 m10, m11, m12;
        }
        union
        {
             __m128 row3;
             component1 m20, m21, m22;
        }
}

class mat4
{
    union
    {
        mat3 _m3;

        union
        {
             __m128 row1;
             component1 m00, m01, m02, m03;
        }
        union
        {
             __m128 row2;
             component1 m10, m11, m12, m13;
        }
        union
        {
             __m128 row3;
             component1 m20, m21, m22, m23;
        }
        union
        {
             __m128 row4;
             component1 m30, m31, m32, m33;
        }
    }
}

有了这个想法,你就可以做到像

这样的事情
mat4 m4;
m4.m00 = 3.0f;

mat3& m3 = m4._m3;
m3.m00 = 5.0f; // m4.m00 is now 5.0f