|
11 / 10 / 3
Регистрация: 15.11.2015
Сообщений: 250
|
||||||
Как работает union в С++01.11.2024, 15:47. Показов 5594. Ответов 91
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста.
Как работает union в С++ Везде написано, что элементы union, занимают одну область памяти. Область памяти размером по наибольшему элементу.
И присвою значение для char. И учитывая, что они занимают одну область памяти. Значит char должна затереть часть битов int. И int перестанет иметь прежнее значение.
0
|
||||||
| 01.11.2024, 15:47 | |
|
Ответы с готовыми решениями:
91
Union как работает? union как определить из какой таблице запись после UNION? функция union что выводит на консоль? как работает? |
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||
| 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
|
||||
|
фрилансер
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
|
||
| 02.11.2024, 06:55 | ||
|
Verevkin, можно верить, а можно не верить в UB. Но в стандарте про это написано, а разработчики компиляторов (лично слышал от одного из них) прямо говорят - оно существует
![]() Выражается это так: сегодня твоя программа работает вроде правильно и кормит тебя. А завтра чуть поменяешь настройки компилятора или обновишь версию/стандарт. Пересобирёшь программу, и там всё станет работать чуточку иначе. Непредсказуемо. A a=*((A*)&b);, только при этом не будет UB (если, конечно, это POD типы). А человеку так нельзя
0
|
||
|
фрилансер
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
|
||||||
| 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
|
|||||||
|
Заблокирован
|
|
| 02.11.2024, 12:00 | |
|
Интересная тема....
А реальная польза? Примерчик бы кто привёл...
0
|
|
|
213 / 59 / 7
Регистрация: 05.10.2023
Сообщений: 514
|
|
| 02.11.2024, 12:04 | |
|
Не по теме:
0
|
|
|
Заблокирован
|
|
| 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
|
||
|
Заблокирован
|
|
| 02.11.2024, 12:26 | |
|
Тоже пишут что то похожее. (Покорректнее правда.) А как если у меня на компиляторе и си и с++ включено.?..
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 02.11.2024, 12:30 | |
|
0
|
|
|
Заблокирован
|
|
| 02.11.2024, 12:32 | |
|
Я пишу на смеси си и си++.
Принимает и то и другое. Где то в настройках наверное можно переключиться на чистое си. Я пишу вот так... msvc2015 Понял - UB.. Ну и ладушки... (Не пользовал я union ни разу...)
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 02.11.2024, 12:41 | ||
|
То, что компилируется компилятором Си - работает по правилам Си. Вы разные части программы реально компилируете компиляторами с разными настройками? чета я сомневаюсь. Наверняка же всё С++ компилятором комплируете и не заморачиваетесь. А то, что сама параграмма при этом не выходит за рамки синтаксиса Си - так это не важно абсолютно.
0
|
||
|
Заблокирован
|
||
| 02.11.2024, 12:49 | ||
|
Как можно писать на Си в Visual Studio 2015?
Есть такое... Добавлено через 2 минуты printf() - это си. std printf() - это плюсы. Очень просто. И так всё до кучи...
0
|
||
|
фрилансер
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
|
|||||
| 02.11.2024, 13:21 | |||||
|
Точно так же можно скользить указателем const char*, а вот его уже можно кастить к другому указателю, который можно разыменовать (если в указуемом месте достаточно памяти для размещения целевого типа).После этого данные копируются std::memcpy ![]() Видно, что как раз при "запрещённом" действии три ассемблерные инструкции, а для std::memcpy - две. Но по содержимому видно, что делается то же самое, только в первом случае компилятор сначала в rax засунул адрес Опять же, тут отключена оптимизация, поэтому, что будет в реальности - нужно смотреть с оптимизацией. В данном же случае я просто показал, что нет вызова функции даже без оптимизации, это обеспечивается стандартом Добавлено через 2 минуты *.c отдаются компилятору C , а *.cpp - компилятору C++
0
|
|||||
|
Модератор
|
||||
| 02.11.2024, 14:48 | ||||
|
Нет, не приводит.
0
|
||||
|
фрилансер
6481 / 5705 / 1132
Регистрация: 11.10.2019
Сообщений: 15,198
|
|||
| 02.11.2024, 15:04 | |||
Но это действительно на свой страх и риск.
0
|
|||
|
Вездепух
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
|
||||||||
| 02.11.2024, 18:58 | ||||||||
|
Тут все намного проще: как только в коде появляется такое использование union, этот код уже автоматически не является С++. Это может быть "Вася++ 2.0", это "мегаязык коляна из третьего подъезда" и т.п. замечательные эзотерические языки программирования. Но это не С++. А здесь - форум по С++. Однако что мой дар предвидения мне подсказывает по этому словесному описанию, что вы действительно там "наовнокодили". С, этого, кстати, и начинается банальная компетентность в программирования: со знания того, что как то же самое можно сделать без "овнокодинга". --- Также в #41 я задал вопрос по поводу вашего: О каком "MS неправильные" вы ведет речь? Где вы увидели связь вашей ссылки с темой? Что мы должны были увидеть там? Это не риторический вопрос, я хочу видеть подробный ответ. В сообщении #49 вы снова вывалили сюда пример уже некоего своего union, объявление которого само по себе совершенно ни о чем не говорит, и снова не видно никакого объяснения. Опять непонятно, что вы этим хотели сказать. Что это было??? Вы флудлите форум тоннами какого-то левого текста и ссылками, которые не имеет никакого отношения к теме. Каждый такой флуд вам придется подробно объяснять. Начнем с ссылки на сайт MS. Итак? (И еще раз: если мой вопрос явно не помечен как риторический, ответ обязателен. Игнорировать заданные мнюю вопросы здесь не принято.)
0
|
||||||||
| 02.11.2024, 18:58 | |
|
Помогаю со студенческими работами здесь
60
Не так работает 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.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|