Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

struct внутри union

518
15 марта 2011 года
Andreika
101 / / 14.02.2003
Что призвана делать вот такая конструкция:
 
Код:
union myUnion
{
    struct myStruct
    {
         int a;
         int b;
    };
}


С какой целью и для чего нужно делать вот такую обертку структуры в union?
29K
15 марта 2011 года
Енот_в_Засаде
224 / / 09.11.2010
Насколько я знаю union используется для экономии памяти, т.е. элементы входящие в union занимают одну и ту же область памяти. Создание объединения вызвано большими расходами памяти при возможности возврата функцией большого количества типов. Пришлось бы обьявлять перемнные для каждого возможного типа, часть из которых вообще могла не использоваться. Наиболее разумно было выделить общую память, в которой могли храниться переменные разных типов. Как раз для этого и придумали использовать объединения.

Ну а насчёт конкретной приведенной конструкции, то, как часто твердят в рекламе, 2 по цене 1, ну в нашем случае, переменных 2 а занимают памяти как 1.
535
15 марта 2011 года
Нездешний
537 / / 17.01.2008
Сам по себе union может использоваться, например, для доступа к отдельным байтам числа
 
Код:
union
{
    int value;
    unsigned char bytes[4];
}
А в сочетании со структурой - для доступа к битовым полям:
Код:
union
{
    struct
    {
        unsigned bit1 : 1;
        unsigned bit2 : 1;
        unsigned bit3 : 1;
        unsigned data: 29;
    } bites;
    unsigned raw;
}
518
16 марта 2011 года
Andreika
101 / / 14.02.2003
Блин, да знаю я про битовые поля и доступ к байтам числа. Что, первый пост никто не прочитал?
В MSDN объявлена вот такая структура:
Код:
typedef struct _OVERLAPPED {
  ULONG_PTR Internal;
  ULONG_PTR InternalHigh;
  union {
    struct {
      DWORD Offset;
      DWORD OffsetHigh;
    };
    PVOID  Pointer;
  };
  HANDLE    hEvent;
} OVERLAPPED, *LPOVERLAPPED;


Вопрос: зачем в середине union внутри у которого struct? Почему не сразу struct? В чем разница?
7
16 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Уважаемый,как же вы не заметили,что в объединении ещё и указатель участвует?..На скобочки надо внимательнее смотреть;)
 
Код:
union{
    struct{
        DWORD Offset;
        DWORD OffsetHigh;
    };
    PVOID Pointer;
}
535
16 марта 2011 года
Нездешний
537 / / 17.01.2008
Блин, а если подумать?

Доступ к частям указателя Pointer
7
16 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Нездешний
Доступ к частям указателя Pointer

А вот кстати,разве PVOID занимает 2 двойных слова?Что-то мне так не кажется

535
16 марта 2011 года
Нездешний
537 / / 17.01.2008
PVOID = void* = int

а OffsetHigh намекает, что это актуально для 64 разрядной системы ;)

ЗЫ
хотя могу ошибаться

PPS
Да и вообще, чего гадать-то. В описании структуры OVERLAPPED в MSDN все сказано:
[QUOTE=MSDN]The Offset and OffsetHigh members together represent a 64-bit file position. [/QUOTE]
63K
16 марта 2011 года
SimSonic
16 / / 14.03.2011
Для 32 разрядного случая указатель - 4 байта, и согласно union - лежит в том же месте, что и Offset. Когда у нас 64 бит, sizeof (SIZE_T) = 8, и указатель лежит в тех же байтах, что и Offset, и OffsetHigh сразу. Единственное, что в нашем случае Little-Endian системы OffsetHigh будет хранить младшие 4 байта указателя, а Offset - старшие.
Делать union-ом смещение до чего либо и указатель на это же самое - обычная практика; например, когда считывается какая-то структура из файла, в файле это смещение. После прочтения ко всем смещениям прибавляется адрес буфера, куда она прочитана, и автоматически получаются указатели, ну, просто же как a + b... Зато не надо делать несколько разных структур.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог