我已经阅读了有关从文件加载结构的问题。字节序和可变大小不同存在问题。但是,让我们说有一个这样的结构:
struct Structure
{
uint8_t value1;
uint16_t value2;
uint32_t value3;
uint64_t value;4
};
让我们说文件总是以小尾数格式写入的,因此应用程序以严格的方式读取它。在这种情况下,字节序不应该引起任何问题。 (让我们假设有某种convertEndinness()函数足够聪明,可以忽略字节顺序问题)。我知道要考虑的第二件事是可变大小变量。这是我的问题。固定大小的类型是否可以解决此问题,为了创建多平台二进制文件,我还应该考虑什么?
答案 0 :(得分:2)
固定大小类型是否可以解决此问题
不太。
固定大小类型具有固定大小,但是它们的alignment要求(以及填充)在平台和/或ABI风格之间可能有所不同。因此,即使具有相同的字节序,您的结构在不同的平台上仍可能具有不同的布局。
您可以坚持不应该进行填充,并使用某些特定于编译器的非标准方式来指定此填充(例如#pragma pack
或__attribute__((packed))
)。但是,这可能会产生更差的代码,无法直接访问未对齐的成员。
要创建多平台二进制文件,我还应该考虑什么?
如果选择字节序,请使用固定大小的类型并正确指定对齐方式,就可以了。
我强烈建议添加标头和/或一些框架信息,以及有关您选择的尺寸和对齐方式的版本以及一些元数据。否则,将来您永远都无法更改此文件格式,除非事情以不愉快的方式中断。