Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 11:33     Union что из себя представляет?
Посмотрите здесь:
Что из себя представляет допустим поток ввода/вывода C++
Что из себя представляет код в стеке, и как его использовать C++
C++ Что такое stract pragma и union
Union с явными указателями или void*- что выбрать? C++
C++ Что из себя представляют типы данных?
STL Вектор Копирование элемнтов себя из себя C++
Правильно ли я делаю, что начинаю становления себя как программиста с решения мелких задач из интернета? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
daniilorain
👻👻👻
18 / 25 / 11
Регистрация: 22.04.2016
Сообщений: 166
21.06.2016, 19:11     Union что из себя представляет? #16
Нажимайте на кнопку с синей галочкой вниз, я ведь ваше сообщение случайно увидел
Это битовое поле. Здесь переменные a,b,c...h занимают каждые по 1 биту.
Они нужны здесь для того, чтобы вывести код введённой буквы. Символ занимает 1 байт, то есть 8 бит (в некоторых системах 1 байт = 9 бит, но это оффтоп), в union как раз используются 8 символов, которые занимаются по 1 биту, то есть 1 * 8 = 8 бит они занимают в общем, что соответствует одному символу, который будет введён и записан в union. Символы представляются для компьютера в виде последовательности 0,1 (как и всё остальное), так вот в этот union для компьютера записались нули и единицы. И так как введённый символ ch и структура с битовыми полями занимаются одну область памяти, то нули и единицы можно считать.
01100001 -- двоичное представление символа 'a'
Миниатюры
Union что из себя представляет?  
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
21.06.2016, 19:51     Union что из себя представляет? #17
Цитата Сообщение от easybudda Посмотреть сообщение
Вот к примеру програмка, определяющая порядок байт в системе
С точки зрения стандарта такое поведение незаконное, т.к. нельзя писать в одно поле union'а, а читать из другого. Хотя постфактум такой код будет работать везде (а может быть почти везде)
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,500
21.06.2016, 21:02     Union что из себя представляет? #18
Цитата Сообщение от Evg Посмотреть сообщение
Хотя постфактум такой код будет работать везде (а может быть почти везде)
Это пример из книжки "UNIX разработка сетевых приложений".
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.06.2016, 21:46     Union что из себя представляет? #19
Цитата Сообщение от easybudda Посмотреть сообщение
Это пример из книжки "UNIX разработка сетевых приложений".
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?) И оговорка о том, что стандарт говорит, что подобное действие - UB, здесь вполне уместна.
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
21.06.2016, 21:54     Union что из себя представляет? #20
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules". В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память. И косвенно (или даже прямо) оттуда вытекают ограничения в работе с union'ами. С ходу я в стандарте это место не смог найти. После отпуска поищу на работе, у меня где-то это было выписано
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,500
21.06.2016, 22:10     Union что из себя представляет? #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?
Не, не является. Но кроме этого там ещё куча целая нужных и полезных примеров. Те из них, которые сам где-либо использовал, я на соответствие стандарту не проверял, но до сих пор всё работало.
Цитата Сообщение от silent_1991 Посмотреть сообщение
стандарт говорит, что подобное действие - UB
Кстати, с хода не нашёл, где он такое говорит?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
21.06.2016, 22:43     Union что из себя представляет? #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.
может и не врут.
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,500
21.06.2016, 23:05     Union что из себя представляет? #23
Цитата Сообщение от IGPIGP Посмотреть сообщение
может и не врут.
Да скорее всего не врут, интересно только, какие с этим могут проблемы возникнуть? По сути это кусок памяти, содержимое которого можно трактовать по разному...
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
21.06.2016, 23:08     Union что из себя представляет? #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.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
21.06.2016, 23:14     Union что из себя представляет? #25
Цитата Сообщение от easybudda Посмотреть сообщение
интересно только, какие с этим могут проблемы возникнуть?
easybudda, совершенно с Вами солидарен. Однако соображения:
Цитата Сообщение от Evg Посмотреть сообщение
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules".
имеют место быть. Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес.
Это похоже на заговор.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.06.2016, 23:18     Union что из себя представляет? #26
Цитата Сообщение от Evg Посмотреть сообщение
В стандарте конкретно таких слов нету, но есть некий смысл, из которого следует, что указатели на разные типы данных, исключая указатель на char*, должны смотреть на разную память.
9.3.1
...
All non-static data members of a union object have the same address.


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

Цитата Сообщение от IGPIGP Посмотреть сообщение
Так говорят боги Килдык...
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 00:09     Union что из себя представляет? #29
Цитата Сообщение от castaway Посмотреть сообщение
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
Дык у большинства же в лучшем случае копия черновика... А там... Ну вот из того что уже обсуждалось о нарушении strict alliasing:
Как сохранить float в переменной типа char?
Стандарт - не открытый ресурс и сослаться на него, строго говоря, невозможно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 00:31     Union что из себя представляет?
Еще ссылки по теме:
Union C++
Union C++
Union C++
C++ Управляемый value union
обьединения union C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.06.2016, 00:31     Union что из себя представляет? #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.
Вот и делайте выводы
Yandex
Объявления
22.06.2016, 00:31     Union что из себя представляет?
Ответ Создать тему
Опции темы

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