在这个矩阵类中使用 union 是完全安全的吗?

ide*_*suk 4 c++ templates matrix unions

工会不是我经常使用的东西,在这里看了一些其他关于它们的问题之后,似乎几乎总是有某种警告,它们可能不起作用。例如。结构可能具有意外的填充或字节序差异。

在我正在使用的数学库中遇到了这个问题,我想知道它是否是完全安全的用法。我假设多维数组没有任何额外的填充,并且由于两个定义的类型相同,它们保证占用完全相同的内存量?

template<typename T> class Matrix44T
{
    ...

    union
    {
        T M[16];
        T m[4][4];
    } m;
};
Run Code Online (Sandbox Code Playgroud)

这种设置有什么缺点吗?定义的顺序对它的工作方式有什么影响吗?

And*_*nck 5

尽管我在 Matrix 类中做的完全相同,但我认为这取决于实现,请仔细阅读标准:

标准 9.5.1:

在一个联合中,最多有一个数据成员可以随时处于活动状态,即最多一个数据成员的值可以随时存储在联合中。[注意:为了简化联合的使用,做了一个特殊的保证:如果一个 POD-union 包含多个共享一个公共初始序列的 POD-structs (9.2),并且如果这个 POD-union 类型的对象包含以下之一POD-structs,允许检查任何 POD-struct 成员的公共初始序列;见 9.2。]

那么问题是 domM共享一个共同的初始序列,为了回答这个问题,我们看 9.2/15:

如果两个 POD 联合(第 9 条)类型具有相同数量的非静态数据成员,则它们是布局兼容的,并且相应的非静态数据成员(以任何顺序)具有布局兼容类型 (3.9)。

阅读完这篇文章后,答案似乎是,不mM严格意义上的布局不兼容。

在实践中,我认为这在所有编译器上都可以正常工作。