Если вы используете GCC и собираетесь разыменовать указатели, ссылающиеся на одно и то же местоположение, лучше придерживаться союзов.
Рассмотрим следующий код:
int main() {
char rgba[4] = {0xCC, 0xCC, 0xCC, 0};
int *value = (int*)&rgba;
}
Компиляция этого кода с -Wstrict-aliasing = 2 вызовет предупреждение о нарушении строгих правил псевдонимов. Доступ к значению - неопределенное поведение. С другой стороны, использование union для доступа к какой-либо части другой переменной не является нарушением строгих правил псевдонимов.