求C联盟清晰度

hoo*_*oop 5 c unions

typedef union {
    float flts[4];
    struct {
        GLfloat r;
        GLfloat theta;
        GLfloat phi;
        GLfloat w;
    };
    struct {
        GLfloat x;
        GLfloat y;
        GLfloat z;
        GLfloat w;
    };
} FltVector;
Run Code Online (Sandbox Code Playgroud)

好的,所以我想我得到了如何使用它,(或者,这是我看到它使用的方式)即.

FltVector fltVec1 = {{1.0f, 1.0f, 1.0f, 1.0f}};
float aaa = fltVec1.x;
etc.
Run Code Online (Sandbox Code Playgroud)

但我真的不知道联盟宣布了多少存储空间(4个花车?8个花车?12个花车?),怎么样?为什么?还有为什么在使用FltVector {{}}时有两组花括号?

为什么要使用工会呢?为什么不这样做..

   struct FltVector {
        GLfloat x;
        GLfloat y;
        GLfloat z;
        GLfloat w;
   }
Run Code Online (Sandbox Code Playgroud)

任何指针都非常赞赏(对不起双关语)

Ark*_*kku 5

联合允许您为不同类型的变量"回收"相同的内存区域.通常,union会占用与其单个最大成员一样多的存储空间,在这种情况下可能需要4个浮点数.你可以查看sizeof.

在这种情况下,union可能用于为结构中的相同浮点数提供1)替代名称(例如x,r共享相同的内存),以及2)访问与数组相同的四个浮点数(例如x,flts[0]共享相同的内存) .有时,工会被用在各种"黑客"中,通常是非便携式的,以访问某些数据类型的内部,例如机器顺序中整数的单个字节.


Sal*_*gar 5

如果sizeof(GLfloat) == sizeof(float)那时,已经分配了4个花车.

flts[0],r并且x都将在这里引用相同的内存.

在联合中,联合中声明的每个不同变量都指向同一块内存.

这里我们有3个变量,2个结构和一个数组,每个变量都从内存中的同一点开始.