C++ 为什么glm::vec将vec值表示为并集?

C++ 为什么glm::vec将vec值表示为并集?,c++,glm-math,C++,Glm Math,我在看vec4glm的源代码实现,我想知道为什么它们用一个并集表示向量值,而不是像float或int这样的原始数据类型 这是我在vec4实现中找到的代码: union { T x, r, s; }; union { T y, g, t; }; union { T z, b, p; }; union { T w, a, q; }; 如果我们只写tx,tyy,tz,tw,有什么区别呢?因为vec4通常用于: 空间坐标x,y,z,w 彩色组件r,g,b,a 纹理坐标s,t,p,q(尽管这些坐标标准

我在看
vec4
glm的源代码实现,我想知道为什么它们用一个并集表示向量值,而不是像
float
int
这样的原始数据类型

这是我在
vec4
实现中找到的代码:

union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };

如果我们只写
tx
tyy
tz
tw
,有什么区别呢?

因为
vec4
通常用于:

  • 空间坐标
    x
    y
    z
    w
  • 彩色组件
    r
    g
    b
    a
  • 纹理坐标
    s
    t
    p
    q
    (尽管这些坐标标准化程度较低,我也看到
    r
    u
    在不同的上下文中使用)

使用联盟允许使用第二个数据成员作为“<代码> > y < />代码>或<代码> g >代码>,取决于您的偏好和语义。

GLM的设计类似于GLSL,与C++允许的一样。在GLSL中,向量的swizzle操作可以使用

xyzw
rgba
stpq
,相应的元素名称引用向量的相同元素。因此,union用于匹配此行为。

加上一个用于突出显示与GLSL的兼容性,我没有考虑到这一点。这是真正的原因。GLM的行为不象一个天生设计的C++类。只是一个注释:这使得它<代码> v.x==v.r==v.s/c>这是使用定义的行为吗?我知道使用联合进行类型双关不是,但这并不是真正的类型双关。@chbaker0如果对给定成员只使用一个名称,毫无疑问。如果您使用多个。。。我仍然这样认为。我更熟悉C语言,它有专门针对工会的语言。C++似乎没有,但是我认为在“对象生命周期”(N4140 3.8 7)下的一些东西具有使它合法的作用,因为不同的名称是不同的“对象”,具有相同的类型和相同的存储位置,并且存储在使用一个和使用另一个之间不被释放。(这导致一个生命周期的结束,另一个则从技术上开始)。@ Chbkal0:是的,它是定义良好的行为,因为所有的类型都是相同的。是的,即使在C++中。@ NigOLBOAS在C++ 11标准中的语言是“在联合中,任何时候最多一个非静态数据成员可以处于活动状态,也就是说,在任何时候,最多一个非静态数据成员的值可以存储在联合中,“从表面上看,答案似乎是否定的。这就是我问的原因。不过霍布斯的答案很有说服力。@chbaker0你引用的那一段的其余部分解释了为什么你可以像他们那样使用union。假设
T
是一种标准布局类型(所有原语都是),那么你可以从它们的公共部分访问数据(因为它们都是相同的类型,所以是整个值)