【发布时间】:2014-11-30 23:23:07
【问题描述】:
我知道 C 中的结构可能不会像在代码中那样布置内存。例如:
struct a {
short x;
int y;
};
假设 2 字节短片和 4 字节整数,可能实际上在内存中占用 8 个字节,因为编译器希望在 4 字节边界上对齐成员......所以 x 之间有 2 个字节的 slack和y。
这使得读写结构无法跨语言、编译器和硬件移植。读取和写入它们的唯一方法是逐个成员。是的,字节序也是一个问题,交换必须在成员级别完成,但我们假设这不是问题。
Fortran 有一个派生类型(结构)的“序列”说明符,它告诉编译器按照给定的成员在内存中布局。这允许可移植地读取和写入派生类型。
我的问题是:有没有办法在 C 中以可移植(且可维护)的方式做类似的事情?
【问题讨论】:
-
大多数编译器都有对 pack 结构的指令,因此它可以在成员之间有其他(或没有)填充。快速搜索应该可以帮助您找到编译器所需的内容。然而,字节序问题并不是那么容易克服,但如果你只针对单个硬件平台,你应该没问题。
-
-
序列化和反序列化为文本,避免字节序、打包和可移植性方面的任何问题。
-
Fortran 的序列类型概念从根本上不允许“可移植地读取和写入派生类型”。跨不同的编译器和不同的平台(以及同一平台上的不同编译器选项)您仍然可能存在兼容性问题。