|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5716. Ответов 91
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста.
Как работает union в С++ Везде написано, что элементы union, занимают одну область памяти. Область памяти размером по наибольшему элементу.
И присвою значение для char. И учитывая, что они занимают одну область памяти. Значит char должна затереть часть битов int. И int перестанет иметь прежнее значение.
0
|
||||||
| 01.11.2024, 15:47 | |
|
Ответы с готовыми решениями:
91
Union как работает? union как определить из какой таблице запись после UNION? функция union что выводит на консоль? как работает? |
|
Модератор
|
||||||||||||
| 02.11.2024, 20:51 | ||||||||||||
|
То есть не насыпать терминов вроде "текущего активного члена" никак не реализованного ни в одном компиляторе С++, а толково объяснить почему использование union для реинтерпретации данных плохо по сравнению с такими то и такими то способами. Критериев плохого кода множество. Рассмотрим самые важные и проверяемые 1. В коде возникает UB. При корректном использовании union, в том числе для реинтерпретации данных UB не возникает, г-кодеры получают деньги а не рекламации. 2. Код медленный или требует большего расхода памяти. Как, вроде бы разобрались выше, использование std::memcpy требует двух машинных команд, да ещё нужно куда то скопировать, т.е. нужно создать переменную. В случае union можно никуда не копировать. Заполнили union через один член и сразу доступен другой член требуемого типа. Т.е. по п.2. union выигрывает. И так, почему вы считаете это трэшем? Кликните здесь для просмотра всего текста
После этого ответьте, пожалуйста, если вас не затруднит, на заданные мной вопросы по существу про union и его применимость к другим случаям нежели чем для экономии памяти.
0
|
||||||||||||
|
фрилансер
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,287
|
||
| 02.11.2024, 21:02 | ||
-O0.Для -O3 машинные команды будут одинаковые: https://godbolt.org/z/r3MxzTq7MНо это вот именно здесь повезло, что они одинаковые. Стандарт этого не обещает. Стандарт говорит, что с union такое не гарантировано
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
|||||||
| 02.11.2024, 21:44 | |||||||
))Тут все, как обычно, как всегда было и будет: г-кодеры г-халтурят г-задачи, на которые не-г-кодер просто не будет тратить время, не стоящее уровня г-оплаты. Если задача вдруг эволюционирует в не-г-задачу и в нее придут не-г-кодеры, не успевших вовремя смыться г-кодеров отловят и сочно выпорют на конюшне за каждый пример такого г-кода, своего и чужого. Сколько мы уже видели таких порок, да чуть ли не мирового масштаба... "Знаковые типы просто заворачиваются, никакого UB" Затем: strict overflow semantics, дикие вопли и звуки порки с конюшен, запах пригорелых задниц. Овнари, усвоив науку, прячутся по норам, пока не заживут пятые точки... Потом "реинтерпретауия через указатель всегда работает, никакого UB" Затем: strict aliasing semantics, дикие вопли и звуки порки с конюшен, запах пригорелых задниц. Овнари, усвоив науку, прячутся по норам, пока не заживут пятые точки... Потом "memcpy всегда копирует слева направо, можно копировать перекрывающиеся регионы, никакого UB". Затем: известный скандал с обратным memcpy, дикие вопли и звуки порки с конюшен, запах пригорелых задниц. Овнари, усвоив науку, прячутся по норам, пока не заживут пятые точки... Как говорится, вы сейчас здесь. И вышеописанная живописная эволюция относится именно к г-проектам, эволюционировавшим в что-то более респектабельное. Если же проект с самого начала г-проектом не был, то на конюшню за такое обращение с union вы улетите сразу, не дожидаясь появления некоего "strict active membеr semantics" в каком-нибудь GCC. Либо вы способны к обучению, либо нет. И в нынешнем состоянии можно уже с уверенностью говорить, что надежда на какое-то обучение возможна только после полного вытравливания из бошки всей той чуши, которая там окопалась. До состояния tabula rasa. То есть с нуля. Без этого толку не будет. Но это не более чем болтовня "ни о чем", через которую г-кодерные тролли пытаются увести разговор от темы. Реинтерпретация через union - UB. То есть никакого осмысленного кода она не порождает. --- Участникам форума: кто-нибудь может мне внятно объяснить, что данный аффтар хочет сказать вот этими стенами объявлений, которые он флудпостит уже третий раз. Первой была ссылка на майкрософт в сообщении #40. Любые попытки получить от него какие-то объяснения пока приводили лишь к очередному флуду из очередного набора объявлений. Что это? Это какой-то глюк? Глюк человека? Глюк AI-бота? Мне искренне интересно.
0
|
|||||||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
|
| 03.11.2024, 13:10 | |
|
Меня всегда удивлял этот подход: придумывать свои собственные способы что-то сделать в обход официальной инструкции. Интересно, это во всём так? Ну типа, купили тостер и там в инструкции описан порядок действий, но мы инструкцию не читаем, а сразу делаем как нам нравится. Забавляет потом читать отзывы, когда человек ругает этот тостер, потому что он плохо работает. При этом при эксплуатации он нарушил все мыслимые правила, описанные производителем.
И этот феерический аргумент: "инструкцию пишут дурачки, я-то лучше знаю, у меня этих тостеров уже 10 штук было". Что вот сложного в этом? В языке оставили возможность оптимизации для сгенерированого кода, эта возможность описана и документирована. Не важно, используется она сейчас или нет. Не важно, пошёл ли производитель компилятора на поводу у юзеров и не стал использовать эту возможность, или не пошёл. Всё равно она есть. Это, блин, так трудно прочитать о ней, и не применять её превратно? Обязательно нужно домысливать и извращать идею? Мне не понятно.
0
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 03.11.2024, 13:26 | ||
|
0
|
||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||
| 03.11.2024, 13:50 | ||
|
UB - это не какая-то процедура, которая вдруг возникает и все портит. Это ситуация (чаще всего маргинальная и нелогичная по своей сути), которую допустил программер и по поводу которой язык не дает никаких гарантий. А сделано это для - возможности более гибко проводить оптимизации, - не усложнять и без того сложный инструментарий, - не ограничивать применение на разных платформах, - не замедлять программу включением постоянного контроля за всевозможными маргинальными случаями.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 03.11.2024, 14:06 | ||
|
З.Ы. Я где-то читал, что С++ создали ради шутки, по приколу... Не думаю, что это правда, но иногда меня терзают смутные сомнения. ©
0
|
||
|
фрилансер
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,287
|
||
| 03.11.2024, 14:10 | ||
|
Verevkin, разработчики не добавили UB, они наоборот убрали у компилятора даже мысль, что UB существует. Чтобы компилятор мог сделать код эффективнее.
Пример из жизни: вот режешь ножом колбасу. Подставлять палец - это UB. Но нож про это не в курсе, он просто эффективно режет. Если бы нож на каждый чих проверял, не палец ли ему там подставили, то резать колбасу было бы неудобно, нож бы просто доставал предупреждениями. А то ещё и исключениями бы кидался ![]() Добавлено через 40 секунд
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 03.11.2024, 14:21 | |
|
0
|
|
|
фрилансер
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,287
|
|
| 03.11.2024, 14:27 | |
|
Verevkin, вот! Всё верно. Потому трансляторы и делятся на интерпретаторы и компиляторы
0
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 03.11.2024, 14:30 | |
|
1
|
|
|
фрилансер
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,287
|
|
| 03.11.2024, 14:40 | |
|
Verevkin, C++ - это язык, да
А в чём плохость примера, я так и не понял. Он именно про компилятор для C++
0
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 03.11.2024, 14:53 | ||
![]() ------- Пора закруглять этот флуд. Мне надоело, дома дел полно.
0
|
||
|
6313 / 3036 / 1053
Регистрация: 01.06.2021
Сообщений: 11,562
|
||
| 03.11.2024, 15:11 | ||
|
0
|
||
|
фрилансер
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,287
|
|
| 03.11.2024, 15:12 | |
|
Verevkin, это больше похоже на поведение интерпретатора, там не жалеют проверок. Или отладочный режим. В общем, это снижает эффективность выполнения кода
0
|
|
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||
| 03.11.2024, 19:26 | ||
|
Хотя, видишь ли, все твои ответы говорят о том, что ты не собираешься ни в чём разбираться, что ты всё уже для себя решил и пришел просто повысмеивать что-то там. Какой смысл распинаться, если даже самый логичный довод ничего не переменит? Ты ж взрослый человек, работяга, как ты можешь заблуждаться в чем-то, у тебя ж опыт ого-го, и задач ты решил тьму, и, главное, заработал на этом, так ведь? Никакой аноним с форума ничего тут не изменит. Я по этой причине особо тут не отвечаю, ибо люди неблагодарные скотины. Ты на них кучу времени убьешь, а они тебе "я тут пришёл повысмеивать". Ну и пошёл ты нахер тогда, ды?
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 03.11.2024, 19:32 | |
|
0
|
|
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||
| 03.11.2024, 19:49 | ||
|
Ты сам тему перевёл в общее русло:
Если тебя интересует почему именно с union так, то вопрос нужно было ставить конкретнее. Но и на него уже ответили тут: в целях возможной оптимизации, например внутри union, особенно если он на стеке создан, совсем не обязательно распределять память на максимальный его размер, а ограничиваться только размером активного члена. Но если некто будет абьюзить использование union, то напорется на побочные эффекты этой оптимизации и получит непредсказуемое поведение. Поэтому стандарт говорит: если ты абьюзишь, то гарантий мы тебе не даём. А единственная причина, по которой компилятор эту оптимизацию может не делать - как раз масштаб этого абьюза, все юзают этот абьюз, потому что так юзали в Си, в котором это разрешено, поэтому и в С++ это вопреки документу заставили работать так же. Но, как у же выше опять же говорили (а вы нихрена не читаете и не вникаете), подобная практика может длиться не вечно и, как в случае с memcpy в ядре линукса, в один прекрасный момент разрабы компилятора могут начать юзать предоставленные им стандартом возможности по оптимизации и куча говнокода сломается. Поэтому (безадресно - если что): - знать что это UB, не спорить и не ехидствать - это норм, даже если всё равно продолжаешь юзать абъюз в коде, ты делаешь это сознательно и со всей ответственностью. - ничего не хотеть знать и юзать его потому что искренне полагаешь, что этот код хороший - не норм
1
|
||
| 03.11.2024, 19:49 | |
|
Не так работает Union Не работает UNION в SQLite два и более struct в union неправильно работает НЕ работает Union с присоединенными через ODBC dbf-ми Как обращаться к Union Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|