|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5690. Ответов 91
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста.
Как работает union в С++ Везде написано, что элементы union, занимают одну область памяти. Область памяти размером по наибольшему элементу.
И присвою значение для char. И учитывая, что они занимают одну область памяти. Значит char должна затереть часть битов int. И int перестанет иметь прежнее значение.
0
|
||||||
| 01.11.2024, 15:47 | |
|
Ответы с готовыми решениями:
91
Union как работает? union как определить из какой таблице запись после UNION? функция union что выводит на консоль? как работает? |
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
|
| 01.11.2024, 18:28 | |
|
Verevkin, это не разрешается программисту, а компилятор - он глупый, он верит человеку
![]() Например, не разрешается разыменовывать нулевой или провисший указатель. Не разрешается организовывать гонку данных. Не разрешается нарушать strict aliasing. Но компилятор всё это преспокойно пропускает.
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||
| 01.11.2024, 18:52 | ||||
|
Во-вторых, к "не разрешается" я также отношу неопределенное поведение, как в данном случае.
0
|
||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||||
| 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
|
||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 01.11.2024, 20:02 | |||
|
Как это работает на низком уровне-то? Я понимаю, что там написано, но я не понимаю смысл этого, как это выглядит на практике. Вон у ТС даже картинка в вопросе есть. Как надо подкрутить настройки компилятора, чтобы пример стал выдавать неверный результат? Добавлено через 4 минуты Если взять в качестве примера наш текущий случай, то я ума не разложу, зачем так сделано? Чтобы было неудобно? Получается, что поля каким-то волшебным образом имеют разное время жизни, которое заранее неизвестно. Зачем?
0
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||
| 01.11.2024, 20:16 | |||||||
|
Переключение активного члена union заканчивает lifetime предыдущего активного члена. Чтение объекта, чей lifetime закончился - неопределенное поведение. (12.3, 6.8) Добавлено через 10 минут На практике неопределенное поведение существует для оптимизаций. Компилятор оптимизирует код в рамках уверенности, что неопределенное поведение никогда не происходит. В частности, если неукий код содержит безусловное неопределенное поведение (напр., запись в одно поле union и чтение из другого), значит эта ветвь программы никогда не будет выполняться и код для нее можно не генерировать вообще. А вы нам тут про какие-тот адреса рассказывать пытаетесь...
0
|
|||||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 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
|
||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 01.11.2024, 20:24 | ||
|
О какой вообще "памяти" вы вообще ведете речь? Что такое "выделена"? В С++ понятие "памяти" даже отдаленно не похоже на то, о чем вы здесь рассуждаете.
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 01.11.2024, 20:26 | ||
|
Напоминает мамкин ответ "потому что я так сказала!" на вопрос "почему?". Я не спорю, я просто пытаюсь разобраться, правда ли это, и почему (и для чего) так сделано. А то получается, что в С++ авторы понапихали UB-ситуаций и считают, что проще подкорректировать под них стандарт, чем исключить. ![]() Как же мне повезло, что на работе я сам выбираю, на чём писать софт.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 01.11.2024, 20:27 | ||
|
Вот я, например, положил в переменную значение 25, не менял ее, и затем прочитал. Компилятор вообще устранил эту переменную, потому что понял, что она всегда равна 25. То есть нет никакой памяти, и при этом все работает. Где проблема?
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 01.11.2024, 20:34 | |||
|
Добавлено через 1 минуту
0
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||
| 01.11.2024, 20:36 | ||||
|
Ребенок задает маме вопросы об окружающем мире, который для ребенка (да и для опытного ученого) -непознанный объект исследований, проводимых фактически методом "чёрного ящика", то есть методом научного тыканья палкой и наблюдения реакции. Язык С++ же не надо исследовать методом "черного ящика". Он не прилетел к нам с другой планеты на дискете. В него не надо тыкать палкой. Он полностью описан в стандарте и любая реализация - попытка идеально точно соблюсти требования стандарта.
0
|
||||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 01.11.2024, 20:42 | ||
|
----- Не надо на личности переходить, это мы так щас до оскорблений опустимся. Не хочу.
0
|
||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
|
| 01.11.2024, 20:45 | |
|
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||
| 01.11.2024, 20:53 | |||
|
"Адреса" в программе на С++ появляются только после того, как будет применен оператор взятия адреса &. Без этого никаких "адресов" не существует вообще. То же самое и с "размерами" (sizeof, адресная арифметика и т.п.). Без этого никаких размеров не существует вообще, максимальных или минимальных - неважно.Еще раз повторяю (и я не люблю повторяться): так как активным в union является только один член, памяти всегда нужно ровно столько, сколько занимает это активный член. Никаких "максимальных размеров" здесь нет и не нужно. А все остальное - лишь детали реализации, ничего о сути вопроса нам не сообщающие. Как несложно догадаться, то, к чему я веду, в частности - это что union может располагаться в регистрах процессора и правильный менеджмент этих регистров определяется знанием о текущем активном члене union. Мой пример в том числе об этом. А вы нам тут рассказываете сказки про какую-то "выделенную память", "максимальный размер", "располагаются на картинке" и т.п Ничего этого в С++ нет и никогда не было. Это пионэрские домыслы.
0
|
|||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
||
| 01.11.2024, 20:55 | ||
|
Раньше я понимал работу union как-то так: Пойду чаёк заварю...
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 01.11.2024, 21:03 | ||
|
0
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|||
| 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 | |
|
Не так работает Union Не работает UNION в SQLite два и более struct в union неправильно работает НЕ работает Union с присоединенными через ODBC dbf-ми Как обращаться к Union Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|