Преимущества использования union, когда то же самое можно сделать с помощью struct - C - PullRequest
6 голосов
/ 28 июля 2010

Мне трудно понять, как использовать union в C. Я читал здесь много постов на SO по этому вопросу. Но никто из них не объясняет, почему union предпочтительнее, когда то же самое можно достичь с помощью структуры.

Цитата из K & R

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

union u_tag {
      int ival;
      float fval;
      char *sval;
} u;

Использование будет

if (utype == INT)
    printf("%d\n", u.ival);
if (utype == FLOAT)
    printf("%f\n", u.fval);
if (utype == STRING)
    printf("%s\n", u.sval);
else
    printf("bad type %d in utype\n", utype);

То же самое можно реализовать с помощью структуры. Что-то вроде

struct u_tag {
    utype_t utype;
    int ival;
    float fval;
    char *sval;
} u;

if (u.utype == INT)
    printf("%d\n", u.ival);
if (u.utype == FLOAT)
    printf("%f\n", u.fval);
if (u.utype == STRING)
    printf("%s\n", u.sval);
else
    printf("bad type %d in utype\n", utype);

Разве это не то же самое? Какое преимущество дает union

Есть мысли?

Ответы [ 11 ]

0 голосов
/ 28 июля 2010

Как часто упоминалось ранее: профсоюзы экономят память.Но это не единственная разница.Структуры создаются для сохранения ВСЕХ данных подтипов, а объединения создаются для сохранения ТОЛЬКО ОДНОГО из данных подтипов.Поэтому, если вы хотите сохранить целое число или число с плавающей запятой, вам, вероятно, понадобится объединение (но вам нужно помнить где-то еще, какое число вы сохранили).Если вы хотите сохранить оба, вам нужна структура.

...