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

Другие вопросы по тегам