Союз - бесполезный анахронизм или полезная уловка старой школы? - PullRequest
20 голосов
/ 13 мая 2009

Недавно я наткнулся на замечательную книгу о структурах данных " Структуры данных с использованием C " (c) 1991 г., в местной книжной библиотеке, продаваемой за всего $ 2 . Как видно из названия книги, в книге рассматриваются структуры данных с использованием языка программирования C.

Я получил книгу, зная, что она устарела, но, вероятно, будет содержать много продвинутых тем по Си, с которыми я больше не столкнусь.

Конечно же, в течение 5 минут я нашел что-то, чего я не знал о C. Я наткнулся на раздел, в котором говорилось о ключевом слове union, и я понял, что никогда не использовал его и никогда не видел ни одного кода, который бы это делал. Я был благодарен за изучение чего-то интересного и быстро купил книгу.

Для тех из вас, кто не знает, что такое союз, в книге используется хорошая метафора для объяснения:

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

Я мог бы легко придумать надуманные ситуации или взломать, где я бы использовал Союз. (Но меня не интересуют надуманные ситуации или хаки ...)

Вы использовали или видели реализацию, в которой использование Union решило проблему ** более элегантно **, чем не использование Union?

Добавлен бонус, если вы включите краткое объяснение того, почему использование объединения было лучше / проще, чем не использование объединения.

Ответы [ 11 ]

1 голос
/ 13 мая 2009

Я использовал его один раз для грубого вида полиморфизма данных, аналогично markh44's answer. У меня было несколько разных видов данных, которые я хотел потенциально использовать. Я создал объединение всех этих типов и структуру, которая содержала объединение и код, определяющий, какой тип должен использоваться.


union
{
    data_type_1;
    data_type_2;
    data_type_3;
} data_union;

typedef struct _TAG_DATA_WRAPPED_
{
    data_union data;
    int data_type; //better an enum
} WRAPPED_DATA;

WRAPPED_DATA loads_of_data[1024];


Чтобы ответить на ваш вопрос о том, почему это выгодно:

Это позволяет легко распределять списки или массивы данных различных типов и программно управлять их типом. Конечно, большой проблемой является пространство для хранения, потому что если типы имеют очень разные размеры хранения, вы можете потратить много места.

...