8

是否可以像这样在联合中共享两个数组:

struct
    {
        union
        {
            float m_V[Height * Length];
            float m_M[Height] [Length];
        } m_U;
    };

这两个数组共享相同的内存大小还是其中一个更长?

4

2 回答 2

3

两个数组都需要具有相同的大小和布局。当然,如果你用 初始化任何东西m_V,那么所有的访问m_M都是未定义的行为;例如,编译器可能会注意到 in 没有任何 m_V变化,并返回一个较早的值,即使您已经通过m_M. 在遥远的过去,我实际上使用过这样做的编译器。我避免在联合不可见的情况下进行访问,例如通过传递对同一函数m_V的引用和 m_M对同一函数的引用。

于 2012-07-09T11:20:56.770 回答
1

隐含地保证这些在内存中的大小相同。编译器不允许在 2D 数组或 1D 数组的任何地方插入填充,因为所有内容都必须与sizeof.

[当然,如果您写入m_V和读取m_M(反之亦然),您仍然是类型双关语,这在技术上会调用未定义的行为。但那是另一回事。]

于 2012-07-09T11:10:40.677 回答