7 / 7 / 0
Регистрация: 24.06.2009
Сообщений: 44
|
|
1 | |
Union что из себя представляет?27.08.2010, 11:33. Показов 33479. Ответов 52
Метки нет (Все метки)
Читал много книг и там про него не чего не было сказано, парни объясните мне пожалуйста для чего он?
0
|
27.08.2010, 11:33 | |
Ответы с готовыми решениями:
52
Что из себя представляет std::wstring? Что из себя представляет допустим поток ввода/вывода Что из себя представляет код в стеке, и как его использовать Что из себя представляет CMS |
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
21.06.2016, 22:10 | 21 |
Не, не является. Но кроме этого там ещё куча целая нужных и полезных примеров. Те из них, которые сам где-либо использовал, я на соответствие стандарту не проверял, но до сих пор всё работало.
Кстати, с хода не нашёл, где он такое говорит?
0
|
Комп_Оратор)
|
|
21.06.2016, 22:43 | 22 |
easybudda, там где-то есть о том что читать без проблем можно только то что писалось последним. Вот цитата из:
http://en.cppreference.com/w/cpp/language/union там говорят:
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
21.06.2016, 23:05 | 23 |
Да скорее всего не врут, интересно только, какие с этим могут проблемы возникнуть? По сути это кусок памяти, содержимое которого можно трактовать по разному...
0
|
Комп_Оратор)
|
|
21.06.2016, 23:14 | 25 |
easybudda, совершенно с Вами солидарен. Однако соображения:
имеют место быть. Компиляторы уверены, что что два разных объекта не могут иметь один и тот же адрес. Это похоже на заговор.
0
|
21.06.2016, 23:18 | 26 |
Вы воду льёте. Я не то что не верю, просто я нигде об этом не слышал, как и многие другие. Дайте ссылку на пункт в стандарте.
1
|
Комп_Оратор)
|
|
22.06.2016, 00:09 | 29 |
Дык у большинства же в лучшем случае копия черновика... А там... Ну вот из того что уже обсуждалось о нарушении strict alliasing:
Как сохранить float в переменной типа char? Стандарт - не открытый ресурс и сослаться на него, строго говоря, невозможно.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
22.06.2016, 00:31 | 30 |
Там есть определенная тонкость.
В стандарте нет описания того что бывает при нарушении
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
22.06.2016, 00:35 | 31 |
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
22.06.2016, 01:11 | 32 |
Стандарт по сути задекларировал, что любое явно неописанное поведение - непределенное. Что выглядит очень логично, если вдуматься в смысл слова "неопределенное".
Добавлено через 5 минут Впрочем, если кто-то хочет считать это несущественным, то я не против. В конце концов заказчик платит за работающий результат, а не за код и уж тем более не за отсутствие UB. Если разработчик понимает последствия своих действий и отвечает за результат, то остальное философствование не имеет никакого смысла. Однако такое лучше не обсуждать в разделе для новичков, а то они еще подумают, что им все можно
0
|
Комп_Оратор)
|
|
22.06.2016, 09:04 | 33 |
Вообще, система в которой всё что не запрещено, - разрешено, имеет потенциал развития значительно более высокий чем та, у которой всё что не разрешено, - запрещено.
А как же экспериментировать с набиванием собственных шишек? Новичкам стандарт не писан (имхо) DrOffset, как мне удалось перевести и спарсить тут речь о типах одной иерархии. То есть когда оба типа содержат общую цепь байт вначале (инициализированную одной последовательностью конструкторов). Это правильный вывод?
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
||||||
22.06.2016, 09:27 | 34 | |||||
Это вопрос философский.
Впрочем, UB ничего не запрещает. UB - это всего лишь отсутствие стандартизированного поведения. Некоторые проявления UB вполен себе безобидные и контролируются в частных случаях. Например, лезть за пределы выделенной памяти - UB, но если мы конкретно знаем устройство нашего аллокатора, и в курсе, что он помещает информацию по определенному смещению от начала выделенной нам памяти, то вполне сможем эту информацию прочитать, и программа после этогого хоть и станет непортируемой и потеряет в сопровождаемости, но поведение, заложенное нами в рамках текущей реализации сохранится и будет работать. Почему у многих здесь (как и у меня) негативное отношение к UB (даже если оно контролируемо в данный момент), так это потому, что многие (как и я) - занимаются программированием профессионально. И здесь, помимо собственно программирования, принято еще учитывать риски, в том числе на сопровождение кода. Наличие UB этот риск увеличивает. Поэтому в профессиональной разработке принято строго придерживаться установленного в компании регламента на кодирование и стандартов, чтобы получить более предсказуемый цикл разработки ПО. Скажем так, тут речь просто о совместимых по своему представлению типах. Например две структуры, с одинаковым порядком совпадающих полей.
3.9
1
|
Комп_Оратор)
|
|
22.06.2016, 09:51 | 35 |
Такая постановка понятна. Я говорил как раз о том, что UB - запрет именно в смысле нежелательности. С точки зрения закона, если человек не на военной службе, то стрелять себе в ногу это не членовредительство, а его личное дело.
Я говорю о свойствах разрешительной и запретительной систем как таковых. Если Вы знаете что всё не запрещённое явно, разрешено, то Вы можете свободнее конструировать... Впрочем, это действительно философия. Понятно. С практической точки зрения, это чаще всего встречается именно у родственников. Хотя в жизни чего только не бывает.
0
|
22.06.2016, 09:59 | 36 |
Дело тут не в объектах. Пока внутри одной функции строятся обращения к разным полям одного и того же union'а, даже плохой компилятор постфактум в этом разберётся и ничего не напортачит. В реальности всё это вертится вокруг взятия адреса на поля union'а. В примере типа
C int foo (int *p1, float *p2) { *p2 = 0.0f; return *p1; } C union { int i; float f; } u; int i; ... u.i = 0x11111111; i = foo (&u.i, &u.f);
2
|
22.06.2016, 11:45 | 38 |
Тут всё-таки речь идёт о полях объекта, а не о самих объектах. Да и для компилятора всё просто, когда он видит объекты. Все сложности анализов растут в случаях, когда есть только указатель, но не видны сами объекты
0
|
Комп_Оратор)
|
|
22.06.2016, 14:38 | 39 |
-Так он же болгарин!
– Какая разница?! (х/ф "Брат2") Поля объекта это же объекты. Там выше я давал ссылку на обсуждение strict alliasing при наличии двух разнотипных указателей на один и тот же https://habrahabr.ru/post/114117/ Не суть. Думаю мы об одном говорим.
1
|
22.06.2016, 14:52 | 40 |
Хорошая статья. В ней правда не хватает одного полезного совета. При использовании gcc в более-менее сложном проекте опция -fno-strict-aliasing помогает избавиться от головной боли (ценой небольшой потери производительности)
1
|
22.06.2016, 14:52 | |
22.06.2016, 14:52 | |
Помогаю со студенческими работами здесь
40
Что из себя представляет WordPress? Что представляет из себя WikiLeaks? Что из себя представляет ковариация? что из себя представляет криптография ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |