Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 145, средняя оценка - 4.79
VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
#1

Union что из себя представляет? - C++

27.08.2010, 11:33. Просмотров 22302. Ответов 52
Метки нет (Все метки)

Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 11:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Union что из себя представляет? (C++):

Что из себя представляет std::wstring? - C++
В общем насколько я понимаю это string с типом wchar_t. Но есть вопросы: 1. Размер типа wchar_t зависит от компилятора и не...

Что из себя представляет допустим поток ввода/вывода - C++
Поясните пожалуйста что из себя представляет допустим поток ввода/вывода в С++ ? Это участок памяти который представляет собой что-то вроде...

Что из себя представляет код в стеке, и как его использовать - C++
Гугл мне по этому поводу не помог, поэтому спрашиваю тут: что из себя представляет из себя код в стеке, как его использовать(вызвать там и...

Что такое stract pragma и union - C++
Учусь писать программки для микроконтроллеров, и в большинстве примеров используют эти штучки, пробовал гуглить, но до конца их сути так и...

Union с явными указателями или void*- что выбрать? - C++
В программе предполагается использование огромного количества указателей типа void*, по которым будут хранится объекты типов А и Х. Т.о....

Что из себя представляют типы данных? - C++
Всем привет! Изучаю С++ по книге Шилда Г.С... Прошел тему по Типам данных в С++ и двигаюись дальше... Все что сразу не ясно, со временем...

52
daniilorain
👻👻👻
18 / 25 / 11
Регистрация: 22.04.2016
Сообщений: 166
21.06.2016, 19:11 #16
Нажимайте на кнопку с синей галочкой вниз, я ведь ваше сообщение случайно увидел
Это битовое поле. Здесь переменные a,b,c...h занимают каждые по 1 биту.
Они нужны здесь для того, чтобы вывести код введённой буквы. Символ занимает 1 байт, то есть 8 бит (в некоторых системах 1 байт = 9 бит, но это оффтоп), в union как раз используются 8 символов, которые занимаются по 1 биту, то есть 1 * 8 = 8 бит они занимают в общем, что соответствует одному символу, который будет введён и записан в union. Символы представляются для компьютера в виде последовательности 0,1 (как и всё остальное), так вот в этот union для компьютера записались нули и единицы. И так как введённый символ ch и структура с битовыми полями занимаются одну область памяти, то нули и единицы можно считать.
01100001 -- двоичное представление символа 'a'
0
Миниатюры
Union что из себя представляет?  
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,643
Записей в блоге: 28
21.06.2016, 19:51 #17
Цитата Сообщение от easybudda Посмотреть сообщение
Вот к примеру програмка, определяющая порядок байт в системе
С точки зрения стандарта такое поведение незаконное, т.к. нельзя писать в одно поле union'а, а читать из другого. Хотя постфактум такой код будет работать везде (а может быть почти везде)
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
21.06.2016, 21:02 #18
Цитата Сообщение от Evg Посмотреть сообщение
Хотя постфактум такой код будет работать везде (а может быть почти везде)
Это пример из книжки "UNIX разработка сетевых приложений".
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.06.2016, 21:46 #19
Цитата Сообщение от easybudda Посмотреть сообщение
Это пример из книжки "UNIX разработка сетевых приложений".
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?) И оговорка о том, что стандарт говорит, что подобное действие - UB, здесь вполне уместна.
0
Evg
Эксперт CАвтор FAQ
18248 / 6373 / 438
Регистрация: 30.03.2009
Сообщений: 17,643
Записей в блоге: 28
21.06.2016, 21:54 #20
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules". В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память. И косвенно (или даже прямо) оттуда вытекают ограничения в работе с union'ами. С ходу я в стандарте это место не смог найти. После отпуска поищу на работе, у меня где-то это было выписано
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
21.06.2016, 22:10 #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?
Не, не является. Но кроме этого там ещё куча целая нужных и полезных примеров. Те из них, которые сам где-либо использовал, я на соответствие стандарту не проверял, но до сих пор всё работало.
Цитата Сообщение от silent_1991 Посмотреть сообщение
стандарт говорит, что подобное действие - UB
Кстати, с хода не нашёл, где он такое говорит?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
21.06.2016, 22:43 #22
easybudda, там где-то есть о том что читать без проблем можно только то что писалось последним. Вот цитата из:
http://en.cppreference.com/w/cpp/language/union
там говорят:
it's undefined behavior to read from the member of the union that wasn't most recently written.
может и не врут.
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
21.06.2016, 23:05 #23
Цитата Сообщение от IGPIGP Посмотреть сообщение
может и не врут.
Да скорее всего не врут, интересно только, какие с этим могут проблемы возникнуть? По сути это кусок памяти, содержимое которого можно трактовать по разному...
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
21.06.2016, 23:08 #24
Ы
9.5 Unions
1. In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time. [ Note: One special guarantee is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout structs that share a common initial sequence (9.2), and if an object of this standard-layout union type contains one of the standard-layout structs, it is permitted to inspect the common initial sequence of any of standard-layout struct members; see 9.2. — end note ]
...
Кстати, такая гарантия раньше только для POD был, а теперь для standard-layout.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
21.06.2016, 23:14 #25
Цитата Сообщение от easybudda Посмотреть сообщение
интересно только, какие с этим могут проблемы возникнуть?
easybudda, совершенно с Вами солидарен. Однако соображения:
Цитата Сообщение от Evg Посмотреть сообщение
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules".
имеют место быть. Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес.
Это похоже на заговор.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
21.06.2016, 23:18 #26
Цитата Сообщение от Evg Посмотреть сообщение
В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память.
9.3.1
...
All non-static data members of a union object have the same address.


Цитата Сообщение от silent_1991 Посмотреть сообщение
И оговорка о том, что стандарт говорит, что подобное действие - UB, здесь вполне уместна.
Вы воду льёте.
Цитата Сообщение от easybudda Посмотреть сообщение
где он такое говорит?
Я не то что не верю, просто я нигде об этом не слышал, как и многие другие. Дайте ссылку на пункт в стандарте.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
21.06.2016, 23:22 #27
Цитата Сообщение от castaway Посмотреть сообщение
All non-static data members of a union object have the same address.
Yes them have. Однако надёжно читать можно только последний из записанных. Так говорят боги Килдык...
1
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
21.06.2016, 23:26 #28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако надёжно читать можно только последний из записанных.
Из чего это следует?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Так говорят боги Килдык...
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
22.06.2016, 00:09 #29
Цитата Сообщение от castaway Посмотреть сообщение
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
Дык у большинства же в лучшем случае копия черновика... А там... Ну вот из того что уже обсуждалось о нарушении strict alliasing:
Как сохранить float в переменной типа char?
Стандарт - не открытый ресурс и сослаться на него, строго говоря, невозможно.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
22.06.2016, 00:31 #30
Цитата Сообщение от easybudda Посмотреть сообщение
где он такое говорит?
Там есть определенная тонкость.
В стандарте нет описания того что бывает при нарушении
In a union, at most one of the non-static data members can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.
кроме уточнения:
One special guarantee is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout structs that share a common initial sequence (9.2), and if an object of this standard-layout union type contains one of the standard-layout structs, it is permitted to inspect the common initial sequence of any of standard-layout struct members;
при этом в разделе про UB написано:
Undefined behavior may also be expected when this International Standard omits the description of any explicit definition of behavior.
Вот и делайте выводы
0
22.06.2016, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 00:31
Привет! Вот еще темы с ответами:

STL Вектор Копирование элемнтов себя из себя - C++
Смысл такой, вектор содержит несколько чисел 1,2,3,4,5,6,7 Я хочу на алгоритмах скопировать некоторый блок элементов. например ...

Правильно ли я делаю, что начинаю становления себя как программиста с решения мелких задач из интернета? - C++
Здравствуйте форумчане! Хочу задать вопрос, и узнать ваше мнение. Я начинающий программист на С++. Изучаю теорию по книге Стивена Прата...

Union - C++
Человеки привет =) Скажите пожалуйста для чего используются union в С++?

Union - C++
Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше или равен сумме размеров остальных....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru