Size: a a a

2021 February 27

t

text in supapro.cxx
ну ладно сам подумаю еще как сделать да решу проще
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
вы почему-то считаете, что результат чтения из одинакового адреса будет одинаковым
Вообще то будет. If two union members are standard-layout types, it's well-defined to examine their common subsequence on any compiler.
источник

CD

Constantine Drozdov in supapro.cxx
Mikhail Kalugin
Вообще то будет. If two union members are standard-layout types, it's well-defined to examine their common subsequence on any compiler.
это не одно и то же
источник

CD

Constantine Drozdov in supapro.cxx
я говорю о том, что результат чтения из равных указателей может зависеть от способа получения указателя
источник

CD

Constantine Drozdov in supapro.cxx
именно поэтому существует std::launder
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
я говорю о том, что результат чтения из равных указателей может зависеть от способа получения указателя
А ну да..
источник

t

text in supapro.cxx
нужно было не char а unsigned char
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
именно поэтому существует std::launder
Ну а причем тут виртуальные указатели то? мы же вроде о простых типах говорили. В памяти это просто байты безо всякой магии. Если работает memcpy, то и чтение из union должно (если компилятор  вообще такое позволяет)
источник

MK

Mikhail Kalugin in supapro.cxx
text
нужно было не char а unsigned char
Но, все таки не надо так union использовать, рано или поздно это кончится плохо, лучше всего копировать байты из double в заранее подготовленный буфер.
источник

t

text in supapro.cxx
да я понял
источник

CD

Constantine Drozdov in supapro.cxx
Mikhail Kalugin
Ну а причем тут виртуальные указатели то? мы же вроде о простых типах говорили. В памяти это просто байты безо всякой магии. Если работает memcpy, то и чтение из union должно (если компилятор  вообще такое позволяет)
Мы объектную модель в memcpy не ломаем, это важно. Байты объекта можно читать, но, скажем, неактивные члены юниона не объекты
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
Мы объектную модель в memcpy не ломаем, это важно. Байты объекта можно читать, но, скажем, неактивные члены юниона не объекты
Ну, да, нет никаких гарантий, что прочитается что-то осмысленное.
источник

CD

Constantine Drozdov in supapro.cxx
Mikhail Kalugin
Ну а причем тут виртуальные указатели то? мы же вроде о простых типах говорили. В памяти это просто байты безо всякой магии. Если работает memcpy, то и чтение из union должно (если компилятор  вообще такое позволяет)
И да, про байты в памяти - а в регистрах? У регистров нет адресов
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
И да, про байты в памяти - а в регистрах? У регистров нет адресов
Union всегда в памяти (в конечном итоге). Более того, в стандарте четко описано что а) размер union соответствует размеру его самого большего поля и б) все поля имеют один адрес. Правда есть еще в) чтение только из последнего записанного члена, все остальное UB и г) многие компиляторы реализуют нестандартное расширение, позволяющее читать неактивные члены.
источник

CD

Constantine Drozdov in supapro.cxx
Mikhail Kalugin
Union всегда в памяти (в конечном итоге). Более того, в стандарте четко описано что а) размер union соответствует размеру его самого большего поля и б) все поля имеют один адрес. Правда есть еще в) чтение только из последнего записанного члена, все остальное UB и г) многие компиляторы реализуют нестандартное расширение, позволяющее читать неактивные члены.
А при вызове функции юнион размером 8 байт будет лежать в стеке? Он ведь тривиально копируем
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
А при вызове функции юнион размером 8 байт будет лежать в стеке? Он ведь тривиально копируем
Не факт, компилятор может передать его через регистр, благо он туда влезет. Весь вопрос в механике расширения из последнего пункта. Ну и для задачи «прочитать double побайтно» не обязательно вообще вызывать функцию с union-ом в качестве аргумента.
источник

CD

Constantine Drozdov in supapro.cxx
Речь о том, что пункт (г) это жуткая легасятина и нетривиальные действия компилятора.
источник

CD

Constantine Drozdov in supapro.cxx
Искать там даблы, которые записаны через AL
источник

MK

Mikhail Kalugin in supapro.cxx
Constantine Drozdov
Речь о том, что пункт (г) это жуткая легасятина и нетривиальные действия компилятора.
Есть такое, и я согласен, что этим не стоит пользоваться. union в общем не плохая штука, но его надо использовать как то так struct {Type type; union {double d; char c}} где Type enum {DOUBLE_TYPE, CHAR_TYPE}
источник

MK

Mikhail Kalugin in supapro.cxx
Код скорее всего не совсем корректный, но идею описывает.
источник