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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 145, средняя оценка - 4.79
VintProg
 Аватар для VintProg
7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
27.08.2010, 11:33     Union что из себя представляет? #1
Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2010, 11:33     Union что из себя представляет?
Посмотрите здесь:

Union C++
Union C++
Union с явными указателями или void*- что выбрать? C++
Union C++
Что из себя представляет допустим поток ввода/вывода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.06.2016, 22:10     Union что из себя представляет? #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
И тем не менее, книжка "UNIX разработка сетевых приложений" - не стандарт языка, не правда ли?
Не, не является. Но кроме этого там ещё куча целая нужных и полезных примеров. Те из них, которые сам где-либо использовал, я на соответствие стандарту не проверял, но до сих пор всё работало.
Цитата Сообщение от silent_1991 Посмотреть сообщение
стандарт говорит, что подобное действие - UB
Кстати, с хода не нашёл, где он такое говорит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
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
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.06.2016, 23:05     Union что из себя представляет? #23
Цитата Сообщение от IGPIGP Посмотреть сообщение
может и не врут.
Да скорее всего не врут, интересно только, какие с этим могут проблемы возникнуть? По сути это кусок памяти, содержимое которого можно трактовать по разному...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11840 / 6819 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
21.06.2016, 23:14     Union что из себя представляет? #25
Цитата Сообщение от easybudda Посмотреть сообщение
интересно только, какие с этим могут проблемы возникнуть?
easybudda, совершенно с Вами солидарен. Однако соображения:
Цитата Сообщение от Evg Посмотреть сообщение
Вообще эта тема несколько раз уже проскакивала на форуме. Есть такое понятие, которое на бытовом языке называется "strict aliasing rules".
имеют место быть. Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес.
Это похоже на заговор.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.06.2016, 23:26     Union что из себя представляет? #28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако надёжно читать можно только последний из записанных.
Из чего это следует?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Так говорят боги Килдык...
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
22.06.2016, 00:09     Union что из себя представляет? #29
Цитата Сообщение от castaway Посмотреть сообщение
Это те, кто что-то уверенно утверждает в этой теме не приводя ссылок на стандарт?)
Дык у большинства же в лучшем случае копия черновика... А там... Ну вот из того что уже обсуждалось о нарушении strict alliasing:
Как сохранить float в переменной типа char?
Стандарт - не открытый ресурс и сослаться на него, строго говоря, невозможно.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
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.
Вот и делайте выводы
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.06.2016, 00:35     Union что из себя представляет? #31
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот и делайте выводы
Может своими поделитесь?
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
22.06.2016, 01:11     Union что из себя представляет? #32
Цитата Сообщение от easybudda Посмотреть сообщение
Может своими поделитесь?
Стандарт по сути задекларировал, что любое явно неописанное поведение - непределенное. Что выглядит очень логично, если вдуматься в смысл слова "неопределенное".

Добавлено через 5 минут
Впрочем, если кто-то хочет считать это несущественным, то я не против. В конце концов заказчик платит за работающий результат, а не за код и уж тем более не за отсутствие UB. Если разработчик понимает последствия своих действий и отвечает за результат, то остальное философствование не имеет никакого смысла.
Однако такое лучше не обсуждать в разделе для новичков, а то они еще подумают, что им все можно
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
22.06.2016, 09:04     Union что из себя представляет? #33
Цитата Сообщение от DrOffset Посмотреть сообщение
Стандарт по сути задекларировал, что любое явно неописанное поведение - непределенное.
Вообще, система в которой всё что не запрещено, - разрешено, имеет потенциал развития значительно более высокий чем та, у которой всё что не разрешено, - запрещено.
Цитата Сообщение от DrOffset Посмотреть сообщение
Однако такое лучше не обсуждать в разделе для новичков, а то они еще подумают, что им все можно
А как же экспериментировать с набиванием собственных шишек? Новичкам стандарт не писан (имхо)
Цитата Сообщение от DrOffset Посмотреть сообщение
кроме уточнения:
DrOffset, как мне удалось перевести и спарсить тут речь о типах одной иерархии. То есть когда оба типа содержат общую цепь байт вначале (инициализированную одной последовательностью конструкторов). Это правильный вывод?
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
22.06.2016, 09:27     Union что из себя представляет? #34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вообще, система в которой всё что не запрещено - разрешено, имеет потенциал развития значительно более высокий чем та у которой всё что не разрешено - запрещено.
Это вопрос философский.
Впрочем, UB ничего не запрещает. UB - это всего лишь отсутствие стандартизированного поведения. Некоторые проявления UB вполен себе безобидные и контролируются в частных случаях. Например, лезть за пределы выделенной памяти - UB, но если мы конкретно знаем устройство нашего аллокатора, и в курсе, что он помещает информацию по определенному смещению от начала выделенной нам памяти, то вполне сможем эту информацию прочитать, и программа после этогого хоть и станет непортируемой и потеряет в сопровождаемости, но поведение, заложенное нами в рамках текущей реализации сохранится и будет работать.
Почему у многих здесь (как и у меня) негативное отношение к UB (даже если оно контролируемо в данный момент), так это потому, что многие (как и я) - занимаются программированием профессионально. И здесь, помимо собственно программирования, принято еще учитывать риски, в том числе на сопровождение кода. Наличие UB этот риск увеличивает. Поэтому в профессиональной разработке принято строго придерживаться установленного в компании регламента на кодирование и стандартов, чтобы получить более предсказуемый цикл разработки ПО.

Цитата Сообщение от IGPIGP Посмотреть сообщение
как мне удалось перевести и спарсить тут речь о типах одной иерархии.
Скажем так, тут речь просто о совместимых по своему представлению типах. Например две структуры, с одинаковым порядком совпадающих полей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct A
{
    int a;
    char b;
    short c;
};
 
struct B
{
    int a;
    char b;
    short c;
};
Например, типы int * и int уже не являются layout-compatible.

3.9
11 Two types cv1 T1 and cv2 T2 are layout-compatible types if T1 and T2 are the same type, layout-compatible
enumerations
(7.2), or layout-compatible standard-layout class types (9.2).
9.2
16 The common initial sequence of two standard-layout struct (Clause 9) types is the longest sequence of nonstatic
data members and bit-fields in declaration order, starting with the first such entity in each of the
structs
, such that corresponding entities have layout-compatible types and either neither entity is a bit-field
or both are bit-fields with the same width. [ Example:
C++
1
2
3
4
5
struct A { int a; char b; };
struct B { const int b1; volatile char b2; };
struct C { int c; unsigned : 0; char b; };
struct D { int d; char b : 4; };
struct E { unsigned int e; char b; };
The common initial sequence of A and B comprises all members of either class. The common initial sequence
of A and C and of A and D comprises the first member in each case. The common initial sequence of A and
E is empty. —end example ]
17 Two standard-layout struct (Clause 9) types are layout-compatible if their common initial sequence comprises
all members and bit-fields of both classes
(3.9).
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
22.06.2016, 09:51     Union что из себя представляет? #35
Цитата Сообщение от DrOffset Посмотреть сообщение
Это вопрос философский.
Впрочем, UB ничего не запрещает.
Такая постановка понятна. Я говорил как раз о том, что UB - запрет именно в смысле нежелательности. С точки зрения закона, если человек не на военной службе, то стрелять себе в ногу это не членовредительство, а его личное дело.
Я говорю о свойствах разрешительной и запретительной систем как таковых. Если Вы знаете что всё не запрещённое явно, разрешено, то Вы можете свободнее конструировать... Впрочем, это действительно философия.

Цитата Сообщение от DrOffset Посмотреть сообщение
Скажем так, тут речь просто о совместимых по своему представлению типах.
Понятно. С практической точки зрения, это чаще всего встречается именно у родственников. Хотя в жизни чего только не бывает.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,134
Записей в блоге: 26
22.06.2016, 09:59     Union что из себя представляет? #36
Цитата Сообщение от IGPIGP Посмотреть сообщение
Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес
Дело тут не в объектах. Пока внутри одной функции строятся обращения к разным полям одного и того же union'а, даже плохой компилятор постфактум в этом разберётся и ничего не напортачит. В реальности всё это вертится вокруг взятия адреса на поля union'а. В примере типа

C
int foo (int *p1, float *p2)
{
  *p2 = 0.0f;
  return *p1;
}
имеем обращения по двум указателям: запись по указателю p2 и чтение по указателю p1. Опираясь на Strict aliasing rules компилятор вправе переставить местами операции чтения и записи в память, т.к. эти самые strict aliasing rules говорят о том, что обращения по указателям типа int* и float* обязаны иметь непересекающиеся адреса (т.е. независимые обращения) и следить за этим должен программист. Другими словами, если построить вызов функции

C
union { int i; float f; } u;
int i;
...
u.i = 0x11111111;
i = foo (&u.i, &u.f);
то нет никакой гарантии, что в i будет записано нулевое значение, потому что внутри функции foo компилятор может переставить местами чтение из p1 (т.е. из поля u.i) и запись в p2 (т.е. в поле u.f). Это именно с точки зрения стандарта. Хотя постфактум на современных компиляторах данный код отработает именно так, что в i будет записан 0
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
22.06.2016, 11:20     Union что из себя представляет? #37
Evg, спасибо, - хороший пример. Но вот это:
Цитата Сообщение от Evg Посмотреть сообщение
т.к. эти самые strict aliasing rules говорят о том, что обращения по указателям типа int* и float* обязаны иметь непересекающиеся адреса
разве это не:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес.
(грубо говоря)?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,134
Записей в блоге: 26
22.06.2016, 11:45     Union что из себя представляет? #38
Тут всё-таки речь идёт о полях объекта, а не о самих объектах. Да и для компилятора всё просто, когда он видит объекты. Все сложности анализов растут в случаях, когда есть только указатель, но не видны сами объекты
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
22.06.2016, 14:38     Union что из себя представляет? #39
-Так он же болгарин!
– Какая разница?!
(х/ф "Брат2")

Цитата Сообщение от Evg Посмотреть сообщение
Тут всё-таки речь идёт о полях объекта, а не о самих объектах.
Поля объекта это же объекты.
Там выше я давал ссылку на обсуждение strict alliasing при наличии двух разнотипных указателей на один и тот же объект участок памяти. Там приводится пример из хабра:
https://habrahabr.ru/post/114117/
Не суть. Думаю мы об одном говорим.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 14:52     Union что из себя представляет?
Еще ссылки по теме:

C++ Что из себя представляют типы данных?
Что из себя представляет код в стеке, и как его использовать C++
STL Вектор Копирование элемнтов себя из себя C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,134
Записей в блоге: 26
22.06.2016, 14:52     Union что из себя представляет? #40
Цитата Сообщение от IGPIGP Посмотреть сообщение
https://habrahabr.ru/post/114117/
Хорошая статья. В ней правда не хватает одного полезного совета. При использовании gcc в более-менее сложном проекте опция -fno-strict-aliasing помогает избавиться от головной боли (ценой небольшой потери производительности)
Yandex
Объявления
22.06.2016, 14:52     Union что из себя представляет?
Ответ Создать тему
Опции темы

Текущее время: 20:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru