C++ 读取与活动联合成员类型相同的非活动联合成员是否定义良好?

C++ 读取与活动联合成员类型相同的非活动联合成员是否定义良好?,c++,undefined-behavior,unions,C++,Undefined Behavior,Unions,考虑以下结构: struct vec4 { union{float x; float r; float s}; union{float y; float g; float t}; union{float z; float b; float p}; union{float w; float a; float q}; }; 类似的内容似乎在中使用,例如提供类似GLSL的类型,如vec4,vec2等 但是,尽管预期用途是为了实现这一点 vec4 a(1,2,4,7);

考虑以下结构:

struct vec4
{
    union{float x; float r; float s};
    union{float y; float g; float t};
    union{float z; float b; float p};
    union{float w; float a; float q};
};
类似的内容似乎在中使用,例如提供类似GLSL的类型,如
vec4
vec2

但是,尽管预期用途是为了实现这一点

vec4 a(1,2,4,7);
a.x=7;
a.b=a.r;
,这似乎是一种未定义的行为,因为

在联合中,最多一个数据成员可以在任何时间处于活动状态,也就是说,最多一个数据成员的值可以在任何时间存储在联合中

例如,使用如下定义结构不是更好吗

struct vec4
{
    float x,y,z,w;
    float &r,&g,&b,&a;
    float &s,&t,&p,&q;
    vec4(float X,float Y,float Z,float W)
        :x(X),y(Y),z(Z),w(W),
         r(x),g(y),b(z),a(w),
         s(x),t(y),p(z),q(w)
    {}
    vec4()
        :r(x),g(y),b(z),a(w),
         s(x),t(y),p(z),q(w)
    {}
    vec4(const vec4& rhs)
        :x(rhs.x),y(rhs.y),z(rhs.z),w(rhs.w),
         r(x),g(y),b(z),a(w),
         s(x),t(y),p(z),q(w)
    {}
    vec4& operator=(const vec4& rhs)
    {
        x=rhs.x;
        y=rhs.y;
        z=rhs.z;
        w=rhs.w;
        return *this;
    }
};

还是我在处理一个不存在的问题?是否存在允许访问相同类型的非活动联盟成员的特殊声明?

我认为您所指的引用是针对联盟中具有不同类型的成员

struct foo {
  union {
    float x,
    int y,
    double z,
  };
};
这些是不同的数据,方便地存储在同一个结构中,联合不应该是铸造机制

GLM方法使用相同的数据,并将union用于别名机制

<>你的方法可能是“更好”C++,但它更差的是“工程”。向量数学需要快速,在这种情况下越小越好

您的实现是使向量大3倍<代码>大小(glm::vec4);//16while
sizeof(您的_vec4);//48-哎哟
如果你在哪里处理大量的缓存(通常是这样),那么
你的_vec4
的缓存未命中率是原来的3倍

我认为你是对的,虽然glm使用联合作为别名有点多,但我不确定它是否未定义,但这种类型的东西我见过很多,没有太多问题,而且glm被广泛使用

<>我并不认为在C++中需要模仿GLSL,而<代码>结构{浮法X、Y、Z、W、}会更好(至少在我的脑海里)。