Size: a a a

2020 June 05

OS

Oleksandr Senkovych in pro.cxx
Anatoly Tomilov
если пересылается пакет по сети, то он тоже как бы неоткуда, но жить как-то можно
можно потому сеть написана на С и компиляторы не будут это ломать
источник

OS

Oleksandr Senkovych in pro.cxx
и в C многие трюки а-ля type punning разрешены
источник

IZ

Ilia Zviagin in pro.cxx
Oleksandr Senkovych
можно потому сеть написана на С и компиляторы не будут это ломать
Вовсе нет
источник

IZ

Ilia Zviagin in pro.cxx
Oleksandr Senkovych
это я знаю. меня скорее интересовало какие гарантии я могу ожидать по расположению структур данных в памяти, если приложения которыё с этими структурами работают собираются из разных кодовых баз
У тебя должен быть совместимый ABI , и ты должен это гарантировать.

Как - дело твоё.
Стандарт языка тебе по этому поводу не скажет ничего
источник

AT

Anatoly Tomilov in pro.cxx
в  C++ тоже многое разрешено: reinterpret_cast, Type aliasing, Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true: AliasedType is std::byte, (since C++17)char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.
источник

IZ

Ilia Zviagin in pro.cxx
Oleksandr Senkovych
И вот еще вопрос, если структура создана другим приложением, как мое приложение будет знать о времени жизни обьекта в этой памяти. Я ведь буду делать reinterpret_cast сырых байт в структуру
Никак, у тебя должен быть какой-то интерфейс, протокол обмена этих приложений.
источник

ПК

Побитый Кирпич... in pro.cxx
Oleksandr Senkovych
можно потому сеть написана на С и компиляторы не будут это ломать
С сетью точно так же надо лайфтайм через placement new начинать
источник

AT

Anatoly Tomilov in pro.cxx
Побитый Кирпич
С сетью точно так же надо лайфтайм через placement new начинать
а просто reinterpret_cast — это за рамками дозволенного?
источник

ПК

Побитый Кирпич... in pro.cxx
Anatoly Tomilov
а просто reinterpret_cast — это за рамками дозволенного?
Да
источник

OS

Oleksandr Senkovych in pro.cxx
Anatoly Tomilov
в  C++ тоже многое разрешено: reinterpret_cast, Type aliasing, Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true: AliasedType is std::byte, (since C++17)char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.
здесь сказано обратное - ты можешь делать reinterpret_cast обьекта в байты, а не наоборот
источник

ПК

Побитый Кирпич... in pro.cxx
Oleksandr Senkovych
здесь сказано обратное - ты можешь делать reinterpret_cast обьекта в байты, а не наоборот
Но ты можешь делать memcpy в уже созданный объект
источник

ПК

Побитый Кирпич... in pro.cxx
bit cast и есть memcpy
источник

OS

Oleksandr Senkovych in pro.cxx
Побитый Кирпич
Но ты можешь делать memcpy в уже созданный объект
да, если обьект - trivially copyable. Но ведь я не хочу ничего никуда копировать
источник

OS

Oleksandr Senkovych in pro.cxx
я хочу прямо читать и писать в shmem
источник

ПК

Побитый Кирпич... in pro.cxx
Oleksandr Senkovych
я хочу прямо читать и писать в shmem
Чтение и запись и есть memcpy по сути
источник

OS

Oleksandr Senkovych in pro.cxx
Побитый Кирпич
bit cast и есть memcpy
разве?
источник

AT

Anatoly Tomilov in pro.cxx
ясно. Объект не может появиться, если не был вызван конструктор. Получается для случая разделяемой памяти придётся копировать объект в какую-то свою локацию в процессе, который его не создавал в этой разделяемой памяти
источник

ПК

Побитый Кирпич... in pro.cxx
Да, шаблонный memcpy с возможностью constexpr и доп проверками на этапе компиляции
источник

AT

Anatoly Tomilov in pro.cxx
Anatoly Tomilov
ясно. Объект не может появиться, если не был вызван конструктор. Получается для случая разделяемой памяти придётся копировать объект в какую-то свою локацию в процессе, который его не создавал в этой разделяемой памяти
то есть я не могу получить из другого процесса объект непосредственно в разделяемой памяти в неизменном виде, если у него нет тривиального default конструктора
источник

IZ

Ilia Zviagin in pro.cxx
Anatoly Tomilov
ясно. Объект не может появиться, если не был вызван конструктор. Получается для случая разделяемой памяти придётся копировать объект в какую-то свою локацию в процессе, который его не создавал в этой разделяемой памяти
Ну, если объект standard layout или pod по старому, то можно и так, без конструкторов работать...
источник