05
Фев
2017

Зачем нужно объединение (union)?

Например,

union 
{
    float fl,
    unsigned int uinteg,
    char ch,
    int integ
} foo;

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

foo.fl = 3.14f;
foo.uinteg = 666;
foo.ch = 'a';
foo.int = -25;

уже не получится получить их назад - все перемешается? Способ сэкономить пару байтов или пару тактов и при этом сохранить читабельность? Не писать 4 разных функции, а написать одну, которая принимает union и в ней уже решать, что делать? В таком случае не проще ли принять void * и потом кастануть в тот тип, какой нужен? Как пример "Просто кастануть" приведу такой код:

Классический пример:

typedef enum { STR, INT } tType;
typedef struct {
    tType typ;          // typ is separate.
    union {
        int ival;       // ival and sval occupy same memory.
        char *sval;
    };
} tVal;

void printer(tVal uni)
{
    if (uni.type == INTEGER) // blah-blah
        uni.ival // Используем integer
    else
        ini.sval // В противном случае
}

Функцию принтер можно переписать как-то так:

void printer(void* data, tType typ)
{
    if (tType == INTEGER)
    {
        (int*)data // Чего-то делаем
    }
}

Другой пример:

union 
{
   int a;
   int b;
   int c;
} bar;

bar.a = 20;
bar.b = 50; // Значение a потеряли :(

Опять-таки какой в этом смысл, если я могу сначала завести отдельную переменную int a = 20; а затем изменю ее значение a = 50; и эффект точно такой же? Выглядит как сильное колдовство.

Источник: https://ru.stackoverflow.com/questions/623534/%D0%97%D0%B0%D1%87%D0%B5%D0%BC-%D0%BD%D1%83%D0%B6%D0%BD%D0%BE-%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-union

Тебе может это понравится...

Добавить комментарий