Memory C/C++;,对象是否跨平台兼容?

Memory C/C++;,对象是否跨平台兼容?,memory,cross-platform,Memory,Cross Platform,我想通过一些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++中,有没有任何保证这种事情是可能的?没有保证它能工作。如果您的数据只由

我想通过一些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++中,有没有任何保证这种事情是可能的?

没有保证它能工作。如果您的数据只由一组字符组成,那么它可能会在任何平台上工作

否则,您将遇到硬件和软件问题

硬件问题包括端性和数据对齐

Endianness是指多字节数据类型在内存中的排列方式。例如,一个整数有4个字节,一些体系结构通过在最低地址写入最低有效字节(像奔腾那样的小端字节)将其存储在内存中,而另一些体系结构将最高有效字节存储在最低地址(大端字节)。如果endianness不同,则必须交换字节以确保兼容性。请注意,某些平台(Arm、mips等)可以同时使用endianness,但通常在引导时选择它。此外,有些机器对整数和浮点具有不同的endianness

对齐是指许多体系结构上的限制,即2^k字节的数据必须位于2^k的地址倍数。有些体系结构(如奔腾)没有此约束,可以处理未对齐的数据,但编译器可以以对齐的方式布局数据以提高性能。作为对齐约束的副作用,给定对象在不同的体系结构上可能不具有相同的大小,并且应用于结构的sizeof()不保证返回相同的值

软件问题与数据的性质有关。
显然,如果您的数据包含任何类型的指针,就不可能跨平台传输它们。
如果C++中有构造函数/析构函数的对象,那么如果传输二进制数据,则会遇到问题。 转换数据以允许跨平台安全传输的过程通常称为序列化或酸洗。许多语言(java、javascript、python、R)都有对它的本地支持。在C/C++中,语言中不支持序列化,必须编写自定义序列化,但Boost或MFC等框架提供序列化方法。您还可以查看XDR(外部数据表示),它是一种序列化标准,由多个库支持