次のようにユニオンで 2 つの配列を共有することは可能ですか?
struct
{
union
{
float m_V[Height * Length];
float m_M[Height] [Length];
} m_U;
};
これら 2 つの配列は同じメモリ サイズを共有していますか、それともどちらかが長いですか?
次のようにユニオンで 2 つの配列を共有することは可能ですか?
struct
{
union
{
float m_V[Height * Length];
float m_M[Height] [Length];
} m_U;
};
これら 2 つの配列は同じメモリ サイズを共有していますか、それともどちらかが長いですか?
両方のアレイは、同じサイズとレイアウトである必要があります。もちろん、を使用して何かを初期化するm_V
と、へのすべてのアクセスm_M
は未定義の動作になります。たとえば、コンパイラは、で要素を変更した場合でも、の何も
m_V
変更されていないことに気づき、以前の値を返す場合がありますm_M
。遠い昔、私は実際にそうするコンパイラを使ったことがあります。同じ関数への参照とへの
参照を渡すなど、ユニオンが表示されない場所へのアクセスは避けます。m_V
m_M
これらがメモリ内で同じサイズになることが暗黙的に保証されます。コンパイラは、2D 配列または 1D 配列のどこにもパディングを挿入できませんsizeof
。
[もちろん、m_V
読み書きを行った場合m_M
(またはその逆の場合) は、まだ型をしゃれていることになり、技術的には未定義の動作を引き起こします。しかし、それは別の問題です。]