Каковы недостатки использования unions
при хранении некоторой информации, такой как последовательность байтов, и возможности доступа к ним сразу или по одному.
Пример: Цвет может быть представлен в RGBA. Таким образом, цветовой тип может быть определен как
typedef unsigned int RGBAColor;
Затем мы можем использовать «сдвиг и маскирование» битов для «получения или установки» значений красного, зеленого, синего и альфа-канала объекта RGBAColor (точно так же, как это делается в функциях Direct3D с помощью макрофункций, таких как D3DCOLOR_ARGB()
).
Но что, если я использовал союз,
union RGBAColor
{
unsigned int Color;
struct RGBAColorComponents
{
unsigned char Red;
unsigned char Green;
unsigned char Blue;
unsigned char Alpha;
} Component;
};
Тогда мне не нужно будет всегда выполнять смещение (<<
) или маскирование (&
) для чтения или записи компонентов цвета. Но есть ли в этом проблема? (Я подозреваю, что в этом есть какая-то проблема, потому что я не видел, чтобы кто-то использовал такой метод.)
Может ли Endianness быть проблемой? Если мы всегда используем Component
для доступа к цветовым компонентам и используем Color
для доступа ко всему (для копирования, назначения и т. д. в целом), порядок байтов не должен быть проблемой, верно?
-- РЕДАКТИРОВАТЬ -- Я нашел старый пост с той же проблемой. Так что я думаю, что этот вопрос своего рода репост: P извините за это. вот ссылка: Рекомендуется ли использовать союзы в C++?
Согласно ответам кажется, что использование союзов для данного примера допустимо в C++. Поскольку там нет изменения типа данных, это всего лишь два способа доступа к одним и тем же данным. Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо. :)