C++平台兼容性

C++ platform compatibility

本文关键字:兼容性 平台 C++      更新时间:2023-10-16

将对象foo写入平台1上的新文件,如下所示:

write( file, &myFoo, sizeof(struct foo) );

然后使用在平台2上读取

read(file, &myFoo, filesize(file) );

foo对象具有以下定义:

struct foo
{
    char  a;
    int   b; 
    long  c;
    char* d;
};

在平台2上加载foo时可能会出现什么样的问题?

各种问题!

我们不知道charintlongchar*在不同平台上的大小是否相同。

d所指的东西怎么了?

成员之间也可能存在填充,这可能因平台而异。大端序和小端序系统将以不同的顺序存储整数和指针的字节。如果你真的很不走运,可能还有一个中端系统。

当你这样做时,你需要注意:

  • 数据类型大小(char是您唯一可以信任的类型)
  • 对齐/填充
  • 无尽
  • 指向无效内存
  • 浮点表示法
  • ASCIIEBCDIC?(是的,说真的吗?)
  • 可能还有其他

我认为,您必须使用pack pragma来确保没有填充。否则,char的大小将为4个字节,具体取决于默认的填充方法。

char*这个地址指针在32位机器上可以有32位,但在64位机器上有64位。所以直接存储指针是无稽之谈。

最后一个是endian。