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

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

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

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

27.08.2010, 11:33. Просмотров 21189. Ответов 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,502
22.06.2016, 00:35     Union что из себя представляет? #31
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот и делайте выводы
Может своими поделитесь?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
22.06.2016, 01:11     Union что из себя представляет? #32
Цитата Сообщение от easybudda Посмотреть сообщение
Может своими поделитесь?
Стандарт по сути задекларировал, что любое явно неописанное поведение - непределенное. Что выглядит очень логично, если вдуматься в смысл слова "неопределенное".

Добавлено через 5 минут
Впрочем, если кто-то хочет считать это несущественным, то я не против. В конце концов заказчик платит за работающий результат, а не за код и уж тем более не за отсутствие UB. Если разработчик понимает последствия своих действий и отвечает за результат, то остальное философствование не имеет никакого смысла.
Однако такое лучше не обсуждать в разделе для новичков, а то они еще подумают, что им все можно
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 09:04     Union что из себя представляет? #33
Цитата Сообщение от DrOffset Посмотреть сообщение
Стандарт по сути задекларировал, что любое явно неописанное поведение - непределенное.
Вообще, система в которой всё что не запрещено, - разрешено, имеет потенциал развития значительно более высокий чем та, у которой всё что не разрешено, - запрещено.
Цитата Сообщение от DrOffset Посмотреть сообщение
Однако такое лучше не обсуждать в разделе для новичков, а то они еще подумают, что им все можно
А как же экспериментировать с набиванием собственных шишек? Новичкам стандарт не писан (имхо)
Цитата Сообщение от DrOffset Посмотреть сообщение
кроме уточнения:
DrOffset, как мне удалось перевести и спарсить тут речь о типах одной иерархии. То есть когда оба типа содержат общую цепь байт вначале (инициализированную одной последовательностью конструкторов). Это правильный вывод?
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 09:51     Union что из себя представляет? #35
Цитата Сообщение от DrOffset Посмотреть сообщение
Это вопрос философский.
Впрочем, UB ничего не запрещает.
Такая постановка понятна. Я говорил как раз о том, что UB - запрет именно в смысле нежелательности. С точки зрения закона, если человек не на военной службе, то стрелять себе в ногу это не членовредительство, а его личное дело.
Я говорю о свойствах разрешительной и запретительной систем как таковых. Если Вы знаете что всё не запрещённое явно, разрешено, то Вы можете свободнее конструировать... Впрочем, это действительно философия.

Цитата Сообщение от DrOffset Посмотреть сообщение
Скажем так, тут речь просто о совместимых по своему представлению типах.
Понятно. С практической точки зрения, это чаще всего встречается именно у родственников. Хотя в жизни чего только не бывает.
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 11:20     Union что из себя представляет? #37
Evg, спасибо, - хороший пример. Но вот это:
Цитата Сообщение от Evg Посмотреть сообщение
т.к. эти самые strict aliasing rules говорят о том, что обращения по указателям типа int* и float* обязаны иметь непересекающиеся адреса
разве это не:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес.
(грубо говоря)?
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
22.06.2016, 11:45     Union что из себя представляет? #38
Тут всё-таки речь идёт о полях объекта, а не о самих объектах. Да и для компилятора всё просто, когда он видит объекты. Все сложности анализов растут в случаях, когда есть только указатель, но не видны сами объекты
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 14:38     Union что из себя представляет? #39
-Так он же болгарин!
– Какая разница?!
(х/ф "Брат2")

Цитата Сообщение от Evg Посмотреть сообщение
Тут всё-таки речь идёт о полях объекта, а не о самих объектах.
Поля объекта это же объекты.
Там выше я давал ссылку на обсуждение strict alliasing при наличии двух разнотипных указателей на один и тот же объект участок памяти. Там приводится пример из хабра:
https://habrahabr.ru/post/114117/
Не суть. Думаю мы об одном говорим.
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
22.06.2016, 14:52     Union что из себя представляет? #40
Цитата Сообщение от IGPIGP Посмотреть сообщение
https://habrahabr.ru/post/114117/
Хорошая статья. В ней правда не хватает одного полезного совета. При использовании gcc в более-менее сложном проекте опция -fno-strict-aliasing помогает избавиться от головной боли (ценой небольшой потери производительности)
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
22.06.2016, 15:44     Union что из себя представляет? #41
Цитата Сообщение от Evg Посмотреть сообщение
В ней правда не хватает одного полезного совета. При использовании gcc в более-менее сложном проекте опция -fno-strict-aliasing помогает избавиться от головной боли
Там написано, что это детский сад:
Детсадовский метод, это отключить проклятый strict aliasing совсем ключиком -fno-strict-aliasing.
vxg
Модератор
3144 / 1946 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
22.06.2016, 15:50     Union что из себя представляет? #42
Цитата Сообщение от Croessmah Посмотреть сообщение
детский сад
а почему?
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
22.06.2016, 15:53     Union что из себя представляет? #43
Цитата Сообщение от vxg Посмотреть сообщение
а почему?
Наверное, потому что легко и
Цитата Сообщение от Evg Посмотреть сообщение
ценой небольшой потери производительности
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
22.06.2016, 15:58     Union что из себя представляет? #44
Цитата Сообщение от Croessmah Посмотреть сообщение
Там написано
Там есть места такие, что зачитаешься:
Почувствуй себя компилятором, подумай мальца за него: не бежит ли лиса, не летит ли орел, не ломается ли алиасинг.
А о компиляторах и ключах компиляции:
6.1. Компиляторы врут, ворнинги ненадежны, -Wall иногда работает (надо включать!), но гарантий не дает.
Ну то есть : "А буде кто с ключом к нам придёт, - от ключа и погибнет."
Оптимистическая трагедия. Я то считал, что объект это не только участок памяти специальным образом размеченный, а это и способ интерпретации участка памяти, который не сном ни духом о том не ведает. Ан-нет. Компилятор в борьбе за скорость продаст и не крякнет. Остаётся, как сказано в статье - пост, молитва и низко калорийная диета с обилием песнопений и полиненасыщенных жирных кислот.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 16:08     Union что из себя представляет?
Еще ссылки по теме:
Union C++
Union C++
Union C++
C++ Управляемый value union
обьединения union C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
22.06.2016, 16:08     Union что из себя представляет? #45
Тут в общем-то дело не в компиляторе, а в языке. В погоне за производительностью в стандарте осталось слишком много всяких UB. Поэтому программируя на Си или Си++ людям приходится так или иначе понимать много разных тонкостей, включая особенности работы компилятора
Yandex
Объявления
22.06.2016, 16:08     Union что из себя представляет?
Ответ Создать тему
Опции темы

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