C / C ++, являются ли объекты бинарно совместимыми на разных платформах? - PullRequest
1 голос
/ 21 июня 2019

Я хотел бы отправить некоторые объектные данные в двоичном виде через некоторое mcu.Я рассматриваю это как кроссплатформенную проблему.Как я хотел бы реализовать это как:

//mcu A
//someObj declared and initialized
Send((uint_8_t*)&someObj,sizeof(someObj));

//mcu B
SomeClass someObj;
Read((uint_8_t*)&someObj,sizeof(someObj));

Есть ли какая-либо гарантия в C / C ++, что такое возможно?

1 Ответ

1 голос
/ 21 июня 2019

Нет гарантии, что это работает.Если ваши данные состоят только из набора символов, они, вероятно, будут работать на любых платформах.

В противном случае вы столкнетесь с аппаратными и программными проблемами.

Аппаратные проблемы включают в себя порядковый номер и выравнивание данных.

Порядковый номер относится к тому, как многобайтовые типы данных располагаются в памяти.Например, целое число имеет 4 байта, и некоторые архитектуры хранят его в памяти, записывая по младшему адресу адреса младший значащий байт (младший порядковый номер, например, pentium), в то время как другие хранят старший значащий байт по младшему адресу (старший порядковый номер).Если порядковый номер отличается, байты должны быть поменяны местами для обеспечения совместимости.Обратите внимание, что некоторые платформы (например, Arm, MIPS) могут использовать оба порядка байтов, но обычно они выбираются во время загрузки.Также некоторые машины имеют различные порядковые номера для целых чисел и чисел с плавающей точкой.

Выравнивание относится к ограничению на многих архитектурах, что данные размером 2 ^ k байтов должны быть по адресу, кратному 2 ^ k.Некоторые архитектуры, такие как Pentium, не имеют этого ограничения и могут манипулировать невыровненными данными, но компилятор может размещать данные выровненным способом для улучшения производительности.Как побочный эффект ограничений выравнивания, данный объект может не иметь одинаковый размер на разных архитектурах, и sizeof (), примененный к структуре, не гарантирует возвращение одного и того же значения.

Проблемы с программным обеспечением связаны с природойваших данных.
Очевидно, что если ваши данные содержат какой-либо указатель, их невозможно передать как есть на разных платформах.
Если у вас есть объекты C ++ с конструкторами / деструкторами, вы снова столкнетесь с проблемами при передаче двоичного файлаdata.

Процесс преобразования данных для обеспечения безопасной передачи между платформами часто называется сериализация или травление .Многие языки (java, javascript, python, R) имеют встроенную поддержку.В C / C ++ нет поддержки сериализации на языке, и пользовательская сериализация должна быть написана, но фреймворки, такие как Boost или MFC, предоставляют методы сериализации.Вы также можете взглянуть на XDR (внешнее представление данных), которое является стандартом сериализации и поддерживается несколькими библиотеками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...