C++ C++;平台兼容性

C++ C++;平台兼容性,c++,C++,对象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时可能会出现什么问题?各种问题 我们不知道在不同的平

对象
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
时可能会出现什么问题?

各种问题

我们不知道在不同的平台上,
char
int
long
char*
的大小是否相同

d指的东西怎么了


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

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

  • 数据类型大小(
    char
    是唯一可以信任的大小)
  • 对齐/填充
  • Endianness
  • 指向无效内存
  • 浮点表示法
  • ASCII
    vs
    EBCDIC
    ?(真的吗?)
  • 可能是其他人

我认为,你必须使用该包装pragma以确保没有填充物。 否则,根据默认的填充方法,char的大小将为4个字节

char*此地址指针在32位机器上可以有32位,但在64位机器上可以有64位。 因此,直接存储指针是毫无意义的


最后一个是endian

这听起来很像家庭作业,
Foo
可能没有正确写出,因为您没有测试
write
的错误返回。还有很多其他的问题,这些问题已经被解决了很多次。这不是家庭作业,而是我的工作面试测试,我觉得我完全被炸了!我只是想通过所有的问题,找出我做错了什么!很抱歉“char是你唯一可以信任的人”——这不是一种有用的方式
sizeof(char)
是1,但是如果平台1上的
char\u位
是16,平台2上是8,那么当文件从一个系统传输到另一个系统时,必须给出一些信息。实际上,16位字符系统可能没有文件系统,而9位系统是如此古老,没有人关心,但原则上你甚至不能相信
char
…他接受了这一点,没有询问middle endian?吓人。和别人一起笑,而不是嘲笑他们。这是非常接近被标记。真的需要居高临下吗?你给答案增加了什么价值。