为结构和相同大小的数组使用union有什么好处

时间:2017-03-28 13:44:17

标签: c++

我在某处读到了一段用于定义3d坐标的代码。因此,他们使用xy& z如下所示进行协调:

    union
    {
        struct
        {
            float x, y, z;
        };
        float _v[3];
    };

我的问题是为什么这里需要union以及使用带数组的struct有什么好处?

3 个答案:

答案 0 :(得分:4)

正如Gill Bates所说,通过这种方式,您可以(可能)以x, y, zv[0], v[1], v[2]的形式访问3个坐标 但根据@Richard Critten的评论,这实际上是一个UB。

您可以通过以下方式以“安全”的方式获得相同的结果:

struct Coordinates
{
    Coordinates():x(v[0]), y(v[1]), z(v[2])
    {
    }

    int v[3];
    int& x;
    int& y;
    int& z;
};

即,使用对数组值的引用并在构造函数中初始化它们

此结构的大小明显不同(大于)您在OP

中显示的联合

答案 1 :(得分:2)

重要说明:此构造会导致未定义的行为。以下是其作者的描述'意图,不幸的是,许多编译器正好转化为作者所期望的行为,这反过来又会导致代码泛滥。

这里不需要

union构造:作者为方便起见使用它。他们放置union的原因是为了给自己提供以两种不同方式访问xyz的语法:

  • 指定字段名称 - 即coord.xcoord.ycoord.z
  • 指定字段索引 - 即coord._v[0]coord._v[1]coord._v[2]

提供类似功能而不会遇到未定义行为的方法是使用内联成员函数进行访问:

struct Vector3D {
    int v[3];
    int& x() { return v[0]; }
    int& y() { return v[1]; }
    int& z() { return v[2]; }
};

int main() {
    Vector3D coord;
    coord.v[0] = 5;
    cout << coord.x() << endl;
    coord.y() = 10;
    cout << coord.v[1] << endl;
    return 0;
}

Demo.

答案 2 :(得分:1)

这样你就可以将3d坐标作为结构来解决..

foo.x;
foo.y; // etc

但它也允许你将3个变量作为一个数组,同时占用相同的空间(至少是计划),访问它们就像..

foo._v[0] // x, etc

无论如何,这就是主意。但是当结构在成员之间有任何类型的填充时,你的数组将会被错位,你最终会读取垃圾值。简而言之,此代码具有未定义的行为,不应使用的错误实现。