|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5585. Ответов 91
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста.
Как работает union в С++ Везде написано, что элементы union, занимают одну область памяти. Область памяти размером по наибольшему элементу.
И присвою значение для char. И учитывая, что они занимают одну область памяти. Значит char должна затереть часть битов int. И int перестанет иметь прежнее значение.
0
|
||||||
| 01.11.2024, 15:47 | |
|
Ответы с готовыми решениями:
91
Union как работает? union как определить из какой таблице запись после UNION? функция union что выводит на консоль? как работает? |
|
фрилансер
6479 / 5702 / 1132
Регистрация: 11.10.2019
Сообщений: 15,188
|
|
| 01.11.2024, 18:28 | |
|
Verevkin, это не разрешается программисту, а компилятор - он глупый, он верит человеку
![]() Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing. Но компилятор всё это преспокойно пропускает.
0
|
|
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||
| 01.11.2024, 18:52 | ||||
|
Во-вторых, к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
0
|
||||
|
Заблокирован
|
|||||
| 01.11.2024, 19:30 | |||||
|
Ну, поржать можно, однако, что не так c кодом моего примера? Что в нём может пойти не так? Покажи, пожалуйста, на практике, а то я не смогу в это поверить: у меня слово "недопустимо" ассоциируется именно c "категорически запрещено". Очень прошу, Маэстро! Добавлено через 2 минуты
0
|
|||||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||||||
| 01.11.2024, 19:53 | ||||||
Добавлено через 5 минут
Т.е. если всё сложить, то при перезаписи одного объекта в union, ты убиваешь (завершаешь жизнь) другого. А значит другой нельзя читать. Читать из него - то же самое, что читать из неинициализированной переменной. Такое же UB. Добавлено через 2 минуты А в Note 1 первой цитаты написано вот это: Если ты про это не слышал, то просто видимо не читал никакой серьезной литературы по С++.
1
|
||||||
|
Заблокирован
|
|||
| 01.11.2024, 20:02 | |||
|
Как это работает на низком уровне-то? Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике. Вон у ТС даже картинка в вопросе есть. Как надо подкрутить настройки компилятора, чтобы пример стал выдавать неверный результат? Добавлено через 4 минуты Если взять в качестве примера наш текущий случай, то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
0
|
|||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
|||||||
| 01.11.2024, 20:16 | |||||||
|
Переключение активного члена union заканчивает lifetime предыдущего активного члена. Чтение объекта, чей lifetime закончился - неопределенное поведение. (12.3, 6.8) Добавлено через 10 минут На практике неопределенное поведение существует для оптимизаций. Компилятор оптимизирует код в рамках уверенности, что неопределенное поведение никогда не происходит. В частности, если неукий код содержит безусловное неопределенное поведение (напр., запись в одно поле union и чтение из другого), значит эта ветвь программы никогда не будет выполняться и код для нее можно не генерировать вообще. А вы нам тут про какие-тот адреса рассказывать пытаетесь...
0
|
|||||||
|
Заблокирован
|
|
| 01.11.2024, 20:17 | |
|
0
|
|
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||||
| 01.11.2024, 20:19 | ||||
|
Про strict aliasing почитай. https://gist.github.com/shafik... ee272a58f8 ОДНАКО, не смотря на это, type punning через union все равно будет работать во многих компиляторах, потому что они (разрабы компиляторов) НАМЕРЕННО НЕ проводят оптимизации aliasing`а (оставляют поведение как в Си). Потому что многие программисты на Си продолжают тащить в Си++ этот приём, и это явление настолько массовое, что проще перестать соответствовать стандарту в этом моменте.
1
|
||||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||
| 01.11.2024, 20:24 | ||
|
О какой вообще "памяти" вы вообще ведете речь? Что такое "выделена"? В С++ понятие "памяти" даже отдаленно не похоже на то, о чем вы здесь рассуждаете.
0
|
||
|
Заблокирован
|
||
| 01.11.2024, 20:26 | ||
|
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?". Я не спорю, я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано. А то получается, что в С++ авторы понапихали UB-ситуаций и считают, что проще подкорректировать под них стандарт, чем исключить. ![]() Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
0
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||
| 01.11.2024, 20:27 | ||
|
Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает. Где проблема?
0
|
||
|
Заблокирован
|
|||
| 01.11.2024, 20:34 | |||
|
Добавлено через 1 минуту
0
|
|||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||
| 01.11.2024, 20:36 | ||||
|
Ребенок задает маме вопросы об окружающем мире, который для ребенка (да и для опытного ученого) -непознанный объект исследований, проводимых фактически методом "чёрного ящика", то есть методом научного тыканья палкой и наблюдения реакции. Язык С++ же не надо исследовать методом "черного ящика". Он не прилетел к нам с другой планеты на дискете. В него не надо тыкать палкой. Он полностью описан в стандарте и любая реализация - попытка идеально точно соблюсти требования стандарта.
0
|
||||
|
Заблокирован
|
||
| 01.11.2024, 20:42 | ||
|
----- Не надо на личности переходить, это мы так щас до оскорблений опустимся. Не хочу.
0
|
||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
|
| 01.11.2024, 20:45 | |
|
0
|
|
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
|||
| 01.11.2024, 20:53 | |||
|
"Адреса" в программе на С++ появляются только после того, как будет применен оператор взятия адреса &. Без этого никаких "адресов" не существует вообще. То же самое и с "размерами" (sizeof, адресная арифметика и т.п.). Без этого никаких размеров не существует вообще, максимальных или минимальных - неважно.Еще раз повторяю (и я не люблю повторяться): так как активным в union является только один член, памяти всегда нужно ровно столько, сколько занимает это активный член. Никаких "максимальных размеров" здесь нет и не нужно. А все остальное - лишь детали реализации, ничего о сути вопроса нам не сообщающие. Как несложно догадаться, то, к чему я веду, в частности - это что union может располагаться в регистрах процессора и правильный менеджмент этих регистров определяется знанием о текущем активном члене union. Мой пример в том числе об этом. А вы нам тут рассказываете сказки про какую-то "выделенную память", "максимальный размер", "располагаются на картинке" и т.п Ничего этого в С++ нет и никогда не было. Это пионэрские домыслы.
0
|
|||
|
Заблокирован
|
||
| 01.11.2024, 20:55 | ||
|
Раньше я понимал работу union как-то так: Пойду чаёк заварю...
0
|
||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||
| 01.11.2024, 21:03 | ||
|
0
|
||
|
Заблокирован
|
|||
| 01.11.2024, 21:16 | |||
Я смотрю в сгенерированный машинный код и вижу, что "она вертится".--------- Пойду спать. Всем спасибо за дискуссию.
0
|
|||
|
Модератор
|
|||
| 01.11.2024, 22:04 | |||
|
Использовать для реинтерпретации memcpy, да даже и приведение типа указателей к другому типу, ничем не менее безопасно чем union-ы. А memcpy ещё и затратно по времени и памяти. И это не MS такие неправильные, применение union широко распространено когда мы только в динамике узнаём тип данных. Согласен что использование union опасно, увеличивает вероятность ошибки. Но альтернативы - reinterpret_cast, сырые указатели, ни чем не лучше.
0
|
|||
| 01.11.2024, 22:04 | |
|
Помогаю со студенческими работами здесь
40
Не так работает Union Не работает UNION в SQLite два и более struct в union неправильно работает НЕ работает Union с присоединенными через ODBC dbf-ми Как обращаться к Union Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Асинхронный приём данных из 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.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|