170 похожих чатов

А как происходит копирование(например при возвращении из функции) union. Вызывается

конструктор от первого поля или побитам?

27 ответов

32 просмотра

Копи ктор первого поля. Если он тривиальный, компилятор может бахнуть memcpy где имеет смысл

Maus-Grau Автор вопроса
Artöm Bakri Al-Sarmini
Копи ктор первого поля. Если он тривиальный, компи...

Т.е. может быть union union_t { bool first; double second; } union_t func(){ union_t uni; uni.second = 1.0; return uni; } ... auto res = func(); res.second // 0.0

Maus Grau
Т.е. может быть union union_t { bool first; do...

А зачем использовать юнионы?

Maus-Grau Автор вопроса
Alexander Karaev
А зачем использовать юнионы?

Чтобы пустые поля не делать, все равно только одно значение может быть. Но я думаю здесь намек на variant.

Maus-Grau Автор вопроса
Alexander Karaev
Да. Сырой union - злющее зло

А variant больше памяти жрет? Просто не смотрел его реализацию

Maus Grau
А variant больше памяти жрет? Просто не смотрел ег...

Он жрёт память минимально возможное количество для его реализации. sizeof() наибольшего поля + sizeof() для индекса типа активного типа + выравнивание

Maus-Grau Автор вопроса
Alexander Karaev
Он жрёт память минимально возможное количество для...

Плохо( нужно минимум памяти. Так как это используется в векторах длина которых экспоненциальна, а таких нод до 2,5млн. И тип определяется один на вектор, поэтому нет смысла хранить тип в каждом обьекте

Maus-Grau Автор вопроса
Alexander Karaev
variant<vector<double>, vector<int>, ...>

Тогда я не смогу перевести один тип в другой без копирования вектора(выделения новой памяти)

Maus Grau
Тогда я не смогу перевести один тип в другой без к...

Что значит "перевести"? variant<vector<int>, vector<double>> - это по сути или вектор целых чисел, или вектор double'ов. Что и куда нужно переводить? Не понимаю

Maus-Grau Автор вопроса
Alexander Karaev
Что значит "перевести"? variant<vector<int>, vecto...

Мне нужно bool и double. И возможность перевести из bool в double. Если bool = false : double =0.0. Если bool = true : double = 1.0

Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Maus Grau
Мне нужно bool и double. И возможность перевести и...

Хм. Но зачем? Если нужно работать с этим вектором как с честным массивом каких-то значений, то имеет смысл хранить всегда double, а интерфейс уже сделать удобным. Т.е. ничего не мешает конвертировать double -> bool на лету, при обращении.

Maus Grau
Мне нужно bool и double. И возможность перевести и...

Если ты опишешь задачу чуть подробнее, возможно придумаем решение получше

Maus-Grau Автор вопроса
Alexander Karaev
Хм. Но зачем? Если нужно работать с этим вектором ...

Так и было раньше, но мне показалось что с разделением будет лучше, не будет 0.9999 и т п.

Maus Grau
Так и было раньше, но мне показалось что с разделе...

Если класть в double ровно единицу, она там и будет лежать

Maus-Grau Автор вопроса

Блин, вот это вопрос... Я кажется ни разу в жизни юнион не возвращал из фукнции... Объекты с юнионом - да, бывало, а вот так вот чтоб голый UNION...

Maus Grau
Мне нужно bool и double. И возможность перевести и...

Для этого не нужен юнион, для этого нужно преобразование типа.

если все члены union тривиально копируемы, то он побайтово копируется, и те объекты, которые были «живы» в исходном union, «оживают» в копии. «объекты» во множественном числе, потому что это применяется рекурсивно ко всем подобъектам http://eel.is/c++draft/class.copy.ctor#15 http://eel.is/c++draft/class.union#general-note-3 если что-то не копируется тривиально, то нужно писать это руками

Artöm Bakri Al-Sarmini
Озадачил. Ждем Влада

меня стоит звать через @, потому что добрую половину этого чата я проматываю (если это про меня)

Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Maus Grau
Спасибо

поправил первую ссылку на стандарт

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта