C / C ++,对象跨平台二进制兼容吗?

时间:2019-06-21 01:29:01

标签: 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 ++中是否有保证可以做到这一点?

1 个答案:

答案 0 :(得分:1)

没有任何保证。如果您的数据仅由一组字符组成,则无论使用哪种平台,它都可能起作用。

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

硬件问题包括字节序和数据对齐。

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

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

软件问题与数据的性质有关。
显然,如果您的数据包含任何类型的指针,则无法像跨平台那样传输它们。
如果您的C ++对象带有构造函数/析构函数,那么在传输二进制数据时也会遇到问题。

转换数据以允许跨平台安全传输的过程通常称为序列化酸洗。许多语言(java,javascript,python,R)对此都有本机支持。在C / C ++中,不支持该语言的序列化,并且必须编写自定义序列化,但是Boost或MFC等框架提供了序列化方法。您还可以查看XDR(外部数据表示形式),它是由多个库支持的序列化标准。