@msuprunenko
C/C++ DirectX

Какой смысл типа union?

Какой смысл типа union? Я знаю что это ну не видел нигде где его используют. Тогда какой его смысл?
  • Вопрос задан
  • 927 просмотров
Решения вопроса 1
Olej
@Olej
инженер, программист, преподаватель
Какой смысл типа union? Я знаю что это ну не видел нигде где его используют.

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

Главное применение union - это наложение разного типа данным на одну общую область памяти, т.е. представление одной области памяти как разные типы данных. Это идёт ещё от блоков COMMON в FORTRAN и вариантных записей Pascal.

Применяется очень широко в системном программировании - например, весь код ядра Linux пестрит union-ами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
petermzg
@petermzg
Самый лучший программист
Для того чтобы в одном объеме хранить данные разных типов.
К примеру в x32 Int - 4 байта, а Double - 8 байт
Делая
union Some {
    int i;
    double a;
};

Вы можете сэкономить место.
struct STRX {
   int j;
   Some v;
}

где j - будет определять тип данных в union Some

Размер union будет по размеру типа с максимальным размером.
Где используется: Для передачи данных по сети. У вас может быть постоянный размер пакета в STRX, но данные разные.
Ответ написан
Комментировать
@Nivka
Иногда нужно экономить память и таким образом.
Наиболее частое применение, что я встречал, - это структуры в файлах.
Ответ написан
@abcd0x00
Можно делать универсальные объекты для хранения.

Пример:
Код
#include <stdio.h>

struct a {
    int a, b, c;
};

struct b {
    double a, b, c, d;
};

struct c {
    char s[100];
};

struct d {
    int a, b, c;
    double n[10];
};

union x {
    struct a a;
    struct b b;
    struct c c;
    struct d d;    
};

typedef struct {
    enum { A, B, C, D } type;
    union x value;
} Obj;

int main(void)
{
    Obj objects[100], *pobj;
    int n;
    int i;

    objects[0].type = A;
    objects[0].value.a.a = 1;
    objects[0].value.a.b = 2;
    objects[0].value.a.c = 3;

    objects[1].type = B;
    objects[1].value.b.a = 1.5;
    objects[1].value.b.b = 2.5;
    objects[1].value.b.c = 3.5;
    objects[1].value.b.d = 4.5;

    objects[2].type = C;
    sprintf(objects[2].value.c.s, "abc");

    objects[3].type = A;
    objects[3].value.a.a = 4;
    objects[3].value.a.b = 5;
    objects[3].value.a.c = 6;

    n = 4;
    
    for (i = 0; i < n; i++) {
        pobj = objects + i;
        switch (pobj->type) {
        case A:
            printf("A: %d %d %d\n",
                   pobj->value.a.a,
                   pobj->value.a.b,
                   pobj->value.a.c);
            break;
        case B:
            printf("B: %g %g %g %g\n",
                   pobj->value.b.a,
                   pobj->value.b.b,
                   pobj->value.b.c,
                   pobj->value.b.d);
            break;
        case C:
            printf("C: %s\n", pobj->value.c.s);
            break;
        case D:
            printf("D: %g\n", pobj->value.d.n[0]);
            break;
        }
    }

    return 0;
}



Вывод
[guest@localhost c]$ .ansi t.c -o t
[guest@localhost c]$ ./t
A: 1 2 3
B: 1.5 2.5 3.5 4.5
C: abc
A: 4 5 6
[guest@localhost c]$
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
Прямого ответа вам не дам, но подкину кой чего для размышления. Парадокс, но до сих пор языки программирования реализуют оператор goto, при том что он уже лет 10 помечен как obsolete/deprecated и вообще в руки не брать. Зачем? возможно для обратной совместимости, возможно в недрах реализации он где-то и применяется. Не используете? ну так не используйте дальше. В чем проблема то? Да принцип Парето никто не отменял - 80% пользователей используют лишь 20% функциональности.
Ответ написан
Это попытка реализации алгебраических типов данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы