Это хорошая практика, чтобы использовать союзы в C ++? - PullRequest
22 голосов
/ 03 июня 2009

Мне нужно определить класс следующим образом:

class Color
{
private:
   union Data
   {
       unsigned int intValue;
       unsigned char argbBytes[4];
   }

private:
    Data m_data;
};

Другой способ, конечно, определить данные как целочисленные и при необходимости привести их к массиву символов.

Мне интересно, какой из них предпочтителен. Противоречие здесь состоит в том, что у меня есть удаленная память о чьем-то напоминании о том, чтобы больше не использовать union, однако в данном случае это более чистое решение.

Ответы [ 12 ]

0 голосов
/ 03 июня 2009

Если вы используете GCC и собираетесь разыменовать указатели, ссылающиеся на одно и то же местоположение, лучше придерживаться союзов.

Рассмотрим следующий код:

int main() {
    char rgba[4] = {0xCC, 0xCC, 0xCC, 0};
    int *value = (int*)&rgba;
}

Компиляция этого кода с -Wstrict-aliasing = 2 вызовет предупреждение о нарушении строгих правил псевдонимов. Доступ к значению - неопределенное поведение. С другой стороны, использование union для доступа к какой-либо части другой переменной не является нарушением строгих правил псевдонимов.

0 голосов
/ 03 июня 2009

Да, безусловно, рекомендуется использовать объединения - это единственный способ сообщить компилятору, что часть памяти используется для хранения различных типов. Использование объединения обеспечивает безопасность статического типа, так как нет необходимости использовать reinterpret_cast <> и облегчает чтение кода.

Также необходимо использовать объединения при компиляции со строгим псевдонимом, и в этом случае компилятор будет предполагать, что указатели на разные типы никогда не будут указывать на одну и ту же память. Строгое псевдонимы само по себе является темой, но при коротком чтении / записи в одну и ту же память с использованием разных типов указателей, когда включен строгий псевдоним, зачастую не будет работать должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...