Два массива в объединении в C++
Можно ли разделить два массива в объединении следующим образом:
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
(или наоборот), вы все равно будете наказывать за тип, что технически вызывает неопределенное поведение. Но это другое дело.]