|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5719. Ответов 91
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста.
Как работает union в С++ Везде написано, что элементы union, занимают одну область памяти. Область памяти размером по наибольшему элементу.
И присвою значение для char. И учитывая, что они занимают одну область памяти. Значит char должна затереть часть битов int. И int перестанет иметь прежнее значение.
0
|
||||||
| 01.11.2024, 15:47 | |
|
Ответы с готовыми решениями:
91
Union как работает? union как определить из какой таблице запись после UNION? функция union что выводит на консоль? как работает? |
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||
| 01.11.2024, 22:15 | ||||
|
При чем здесь "безопасно", если в С++ union НЕ может быть использован для реинтерпретации памяти? Такой функциональности у union нет в принципе и никогда не было. К чему вы привели здесь "приведение типа указателей"? "Приведение типа указателей" НЕ может быть использовано для реинтерпретации памяти вообще нигде - ни в С, ни в С++ (кроме исключения, сделанного для char). Нет такой функциональности в С++. В С++ для реинтерпретации памяти есть только s td::memcpy, std::bit_cast и приведение к char *. memcpy - стандартная, функция, то есть самый оптимальный вариант и по времени, и по памяти.
0
|
||||
|
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
|
||||
| 01.11.2024, 22:20 | ||||
|
memcpy - это интринсик. И для статических размеров он выраждается в обычный доступ, только оптимизации алиасинга предупреждены. А в начале темы было сказано, что на Си так можно делать. А reinterpret_cast - для type punning - это никакая не альтернатива, а точно такой же некорректный код. Читайте уже ссылку выше, хватить поддерживать безграмотность!
2
|
||||
|
фрилансер
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
|
||
| 02.11.2024, 06:55 | ||
|
Verevkin, можно верить, а можно не верить в UB. Но в стандарте про это написано, а разработчики компиляторов (лично слышал от одного из них) прямо говорят - оно существует
![]() Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо. A a=*((A*)&b);, только при этом не будет UB (если, конечно, это POD типы). А человеку так нельзя
0
|
||
|
фрилансер
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
|
||||||
| 02.11.2024, 07:20 | ||||||
|
с оптимизацией
-O0https://godbolt.org/z/jd5a69694
0
|
||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||
| 02.11.2024, 10:24 | |||||||
|
Фантазийный пример (я не знаю как тут будет на самом деле в данном случае, но почему бы оптимизатору не поступить именно так?)
Причем наверняка можно придумать такую архитектуру (а может таковая даже есть?), где и без оптимизатора вот это вот "наложение байтов в памяти для union", как это было придумано в Си и как это фактически реализовывают в С++ компиляторах на x86 сейчас, фактически будет просто невозможным. Но у меня не хватает фантазии такое придумать. PS Ну вот так мир устроен... какой-то особой глубокой логики в этом нет кроме желания бешенной универсальности от языка не зависимо от платформы. Остаётся лишь принять по стандартной схеме: 1. Отрицание · 2. Злость · 3. Торг · 4. Депрессия · 5. Принятие.
1
|
|||||||
|
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
|
|
| 02.11.2024, 12:00 | |
|
Интересная тема....
А реальная польза? Примерчик бы кто привёл...
0
|
|
|
215 / 61 / 7
Регистрация: 05.10.2023
Сообщений: 538
|
|
| 02.11.2024, 12:04 | |
|
Не по теме:
0
|
|
|
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
|
|
| 02.11.2024, 12:16 | |
|
Всё говорит о том, что бы с union не связываться?
https://ru.stack....flow.com/q... 0%B5-union
0
|
|
|
Модератор
|
||||||||||||
| 02.11.2024, 12:23 | ||||||||||||
|
Приведу решённую мной реальную задачу.
Во входном потоке поступают данные в виде разных struct следующих одна за другой. На самом деле существует дополнительная информация для определения границ и типов структур, но для меня она потеряна. Однако имеется возможность угадывать тип структуры по содержимому.
Я сочинил "не могущий быть использованным" юнит
А теперь объясните почему я должен реализацию переделать на безюнионную, использовать bit_cast или чтото ещё? Чем это плохо по сравнению с [указать другой вариант]? Никакого UB у меня там нет. Есть языки в которых тип может иметь разное содержимое, и какое оно контролируется в компайл и ран-таймах, но там в типе хранится ещё и код варианта, в С++, насколько я в курсе, такие типы пока не завезли, да и неудобны они для реинтерпретации. Но там то можно было бы говорить про "активный член" хотя используют другие термины. А в С++ "активный член" можно обсуждать только как рекомендацию в разработке, не обязательную, кто бы что не говорил.
0
|
||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 02.11.2024, 12:25 | ||
|
Для "реинтерпретации памяти" - в С++ нелья, ибо UB. В Си можно. Для задач экономии памяти, когда разработчик очень внимательно следит за руками и очень в этих руках уверен - сколько угодно.
1
|
||
|
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
|
|
| 02.11.2024, 12:26 | |
|
Тоже пишут что то похожее. (Покорректнее правда.) А как если у меня на компиляторе и си и с++ включено.?..
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 02.11.2024, 12:30 | |
|
0
|
|
|
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
|
|
| 02.11.2024, 12:32 | |
|
Я пишу на смеси си и си++.
Принимает и то и другое. Где то в настройках наверное можно переключиться на чистое си. Я пишу вот так... msvc2015 Понял - UB.. Ну и ладушки... (Не пользовал я union ни разу...)
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 02.11.2024, 12:41 | ||
|
То, что компилируется компилятором Си - работает по правилам Си. Вы разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь. Наверняка же всё С++ компилятором комплируете и не заморачиваетесь. А то, что сама параграмма при этом не выходит за рамки синтаксиса Си - так это не важно абсолютно.
0
|
||
|
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,242
|
||
| 02.11.2024, 12:49 | ||
|
Как можно писать на Си в Visual Studio 2015?
Есть такое... Добавлено через 2 минуты printf() - это си. std printf() - это плюсы. Очень просто. И так всё до кучи...
0
|
||
|
фрилансер
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
|
|||||
| 02.11.2024, 13:21 | |||||
|
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю, который можно разыменовать (если в указуемом месте достаточно памяти для размещения целевого типа).После этого данные копируются std::memcpy ![]() Видно, что как раз при "запрещённом" действии три ассемблерные инструкции, а для std::memcpy - две. Но по содержимому видно, что делается то же самое, только в первом случае компилятор сначала в rax засунул адрес Опять же, тут отключена оптимизация, поэтому, что будет в реальности - нужно смотреть с оптимизацией. В данном же случае я просто показал, что нет вызова функции даже без оптимизации, это обеспечивается стандартом Добавлено через 2 минуты *.c отдаются компилятору C , а *.cpp - компилятору C++
0
|
|||||
|
Модератор
|
||||
| 02.11.2024, 14:48 | ||||
|
Нет, не приводит.
0
|
||||
|
фрилансер
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
|
|||
| 02.11.2024, 15:04 | |||
Но это действительно на свой страх и риск.
0
|
|||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
|
||||||||
| 02.11.2024, 18:58 | ||||||||
|
Тут все намного проще: как только в коде появляется такое использование union, этот код уже автоматически не является С++. Это может быть "Вася++ 2.0", это "мегаязык коляна из третьего подъезда" и т.п. замечательные эзотерические языки программирования. Но это не С++. А здесь - форум по С++. Однако что мой дар предвидения мне подсказывает по этому словесному описанию, что вы действительно там "наовнокодили". С, этого, кстати, и начинается банальная компетентность в программирования: со знания того, что как то же самое можно сделать без "овнокодинга". --- Также в #41 я задал вопрос по поводу вашего: О каком "MS неправильные" вы ведет речь? Где вы увидели связь вашей ссылки с темой? Что мы должны были увидеть там? Это не риторический вопрос, я хочу видеть подробный ответ. В сообщении #49 вы снова вывалили сюда пример уже некоего своего union, объявление которого само по себе совершенно ни о чем не говорит, и снова не видно никакого объяснения. Опять непонятно, что вы этим хотели сказать. Что это было??? Вы флудлите форум тоннами какого-то левого текста и ссылками, которые не имеет никакого отношения к теме. Каждый такой флуд вам придется подробно объяснять. Начнем с ссылки на сайт MS. Итак? (И еще раз: если мой вопрос явно не помечен как риторический, ответ обязателен. Игнорировать заданные мнюю вопросы здесь не принято.)
0
|
||||||||
| 02.11.2024, 18:58 | |
|
Не так работает Union Не работает UNION в SQLite два и более struct в union неправильно работает НЕ работает Union с присоединенными через ODBC dbf-ми Как обращаться к Union Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|