|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5591. Ответов 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
|
||||||||||||
|
фрилансер
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
|
||
| 02.11.2024, 21:02 | ||
-O0.Для -O3 машинные команды будут одинаковые: https://godbolt.org/z/r3MxzTq7MНо это вот именно здесь повезло, что они одинаковые. Стандарт этого не обещает. Стандарт говорит, что с union такое не гарантировано
0
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
|||||||
| 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
|
|
|
Заблокирован
|
||
| 03.11.2024, 13:26 | ||
|
0
|
||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||
| 03.11.2024, 13:50 | ||
|
UB - это не какая-то процедура, которая вдруг возникает и все портит. Это ситуация (чаще всего маргинальная и нелогичная по своей сути), которую допустил программер и по поводу которой язык не дает никаких гарантий. А сделано это для - возможности более гибко проводить оптимизации, - не усложнять и без того сложный инструментарий, - не ограничивать применение на разных платформах, - не замедлять программу включением постоянного контроля за всевозможными маргинальными случаями.
0
|
||
|
Заблокирован
|
||
| 03.11.2024, 14:06 | ||
|
З.Ы. Я где-то читал, что С++ создали ради шутки, по приколу... Не думаю, что это правда, но иногда меня терзают смутные сомнения. ©
0
|
||
|
фрилансер
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
|
||
| 03.11.2024, 14:10 | ||
|
Verevkin, разработчики не добавили UB, они наоборот убрали у компилятора даже мысль, что UB существует. Чтобы компилятор мог сделать код эффективнее.
Пример из жизни: вот режешь ножом колбасу. Подставлять палец - это UB. Но нож про это не в курсе, он просто эффективно режет. Если бы нож на каждый чих проверял, не палец ли ему там подставили, то резать колбасу было бы неудобно, нож бы просто доставал предупреждениями. А то ещё и исключениями бы кидался ![]() Добавлено через 40 секунд
0
|
||
|
Заблокирован
|
|
| 03.11.2024, 14:21 | |
|
0
|
|
|
фрилансер
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
|
|
| 03.11.2024, 14:27 | |
|
Verevkin, вот! Всё верно. Потому трансляторы и делятся на интерпретаторы и компиляторы
0
|
|
|
Заблокирован
|
|
| 03.11.2024, 14:30 | |
|
1
|
|
|
фрилансер
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
|
|
| 03.11.2024, 14:40 | |
|
Verevkin, C++ - это язык, да
А в чём плохость примера, я так и не понял. Он именно про компилятор для C++
0
|
|
|
Заблокирован
|
||
| 03.11.2024, 14:53 | ||
![]() ------- Пора закруглять этот флуд. Мне надоело, дома дел полно.
0
|
||
|
6258 / 2978 / 1050
Регистрация: 01.06.2021
Сообщений: 11,042
|
||
| 03.11.2024, 15:11 | ||
|
0
|
||
|
фрилансер
6479 / 5703 / 1132
Регистрация: 11.10.2019
Сообщений: 15,194
|
|
| 03.11.2024, 15:12 | |
|
Verevkin, это больше похоже на поведение интерпретатора, там не жалеют проверок. Или отладочный режим. В общем, это снижает эффективность выполнения кода
0
|
|
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||
| 03.11.2024, 19:26 | ||
|
Хотя, видишь ли, все твои ответы говорят о том, что ты не собираешься ни в чём разбираться, что ты всё уже для себя решил и пришел просто повысмеивать что-то там. Какой смысл распинаться, если даже самый логичный довод ничего не переменит? Ты ж взрослый человек, работяга, как ты можешь заблуждаться в чем-то, у тебя ж опыт ого-го, и задач ты решил тьму, и, главное, заработал на этом, так ведь? Никакой аноним с форума ничего тут не изменит. Я по этой причине особо тут не отвечаю, ибо люди неблагодарные скотины. Ты на них кучу времени убьешь, а они тебе "я тут пришёл повысмеивать". Ну и пошёл ты нахер тогда, ды?
0
|
||
|
Заблокирован
|
|
| 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 | |
|
Помогаю со студенческими работами здесь
80
Не так работает Union Не работает UNION в SQLite два и более struct в union неправильно работает НЕ работает Union с присоединенными через ODBC dbf-ми Как обращаться к Union Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|