是否可以像这样在联合中共享两个数组:
struct
{
union
{
float m_V[Height * Length];
float m_M[Height] [Length];
} m_U;
};
这两个数组共享相同的内存大小还是其中一个更长?
是否可以像这样在联合中共享两个数组:
struct
{
union
{
float m_V[Height * Length];
float m_M[Height] [Length];
} m_U;
};
这两个数组共享相同的内存大小还是其中一个更长?
两个数组都需要具有相同的大小和布局。当然,如果你用 初始化任何东西m_V
,那么所有的访问m_M
都是未定义的行为;例如,编译器可能会注意到 in 没有任何
m_V
变化,并返回一个较早的值,即使您已经通过m_M
. 在遥远的过去,我实际上使用过这样做的编译器。我会避免在联合不可见的情况下进行访问,例如通过传递对同一函数m_V
的引用和
m_M
对同一函数的引用。
隐含地保证这些在内存中的大小相同。编译器不允许在 2D 数组或 1D 数组的任何地方插入填充,因为所有内容都必须与sizeof
.
[当然,如果您写入m_V
和读取m_M
(反之亦然),您仍然是类型双关语,这在技术上会调用未定义的行为。但那是另一回事。]