Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2017, 17:09   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Зачем нужны union и как их использовать

Часто вижу структуры подобного рода:

Цитата:
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics; // 0 for terminating null import descriptor
DWORD OriginalFirstThunk; // RVA to original unbound IAT
};
DWORD TimeDateStamp; // 0 if not bound,
// -1 if bound, and real date\time stamp
// in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new)
// O.W. date/time stamp of DLL bound to (old)
DWORD ForwarderChain; // -1 if no forwarders
DWORD Name;
DWORD FirstThunk; // RVA to IAT
} IMAGE_IMPORT_DESCRIPTOR;
в которых объявлены union'ы с полями разного размера, но здесь оба поля - дворды. Какой в этом смысл? Как я понимаю, внутри union определяются просто алиасы для одного и того же участка памяти. Обращаясь к полям разного размера, мы будем работать с этой памятью (имеющей любой размер) как с памятью данного размера (в зависимости от типа поля). Тогда зачем определять несколько DWORD'овых алиасов?

Кроме того, я где-то читал, что при помощи union можно реализовать что-то вроде std::variant. Как это сделать, чтобы внутри union можно было корректно сохранить и std::string, и скалярные типы?
Aoizora вне форума Ответить с цитированием
Старый 21.07.2017, 17:32   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Тогда зачем определять несколько DWORD'овых алиасов?
Что бы не называть поле Characteristics_or_OriginalFirstThu nk

Цитата:
Как это сделать, чтобы внутри union можно было корректно сохранить и std::string, и скалярные типы?
Как это делает вариант. Хранить, какое поле сейчас активно. При присвоении нового вызывать деструктор старого и конструктор нового и т.д.
p51x вне форума Ответить с цитированием
Старый 21.07.2017, 18:28   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Как это делает вариант.
Варианты обычно НЕ хранят std::string и другие классы - это можно делать начиная с С++ 11, причем надо явно вызывать конструктор одного из вложенных классов.
waleri на форуме Ответить с цитированием
Старый 21.07.2017, 18:39   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Осенью будет принятие С++17, а вы можете все продолжать кодить на с++98 и начинать С++11. Можете посмотреть https://www.youtube.com/watch?v=k3O4EKX4z1c Заодно сходите в http://en.cppreference.com/w/cpp/utility/variant и посмотрите пример.
p51x вне форума Ответить с цитированием
Старый 21.07.2017, 19:59   #5
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Да-да, именно этот std::variant из C++17 я имел в виду. Скорей бы компииляторы начали все это поддерживать.
Aoizora вне форума Ответить с цитированием
Старый 21.07.2017, 21:30   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Да-да, именно этот std::variant из C++17 я имел в виду. Скорей бы компииляторы начали все это поддерживать.
gcc и clang уже поддерживают.
Croessmah вне форума Ответить с цитированием
Старый 21.07.2017, 22:03   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Все уже поддерживают, включая 2017 студию.
p51x вне форума Ответить с цитированием
Старый 21.07.2017, 22:36   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Осенью будет принятие
Вот когда будет...
А мне приходиться жить в реальном мире...
waleri на форуме Ответить с цитированием
Старый 22.07.2017, 00:02   #9
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вот когда будет...
В ноябре.
Цитата:
Сообщение от waleri Посмотреть сообщение
А мне приходиться жить в реальном мире...
В котором новые версии компилятора всё равно не дадут использовать. )))
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зачем нужны многомерные массивы? Sёker Общие вопросы Delphi 13 13.05.2012 15:42
Зачем нужны классы Sylar9 Общие вопросы C/C++ 5 15.03.2012 11:38
Зачем нужны блок-схемы? fs444 Общие вопросы по программированию, компьютерный форум 31 27.01.2010 04:11
Зачем нужны операторы << и >> fs444 Общие вопросы C/C++ 3 23.12.2009 08:07
Кто сможет разъяснить как и зачем использовать виртуальные функции в C++? Dunhil Помощь студентам 5 20.12.2007 14:19