gpt4 book ai didi

c++ - 什么时候会出现结构包装问题?

转载 作者:太空宇宙 更新时间:2023-11-04 15:24:26 25 4
gpt4 key购买 nike

我一直在阅读有关 struct bit packing order problems 的文章,但由于接触有限,我自己还没有遇到过。但是,我注意到这些讨论主要针对非常复杂的应用程序。

我现在正在编写一个结构来保存来自 ifstream 的信息

struct MyFileStruct
{
char data1[40];
int data2;
char data3[12];
// etc..
};

ifstream fin;
// .. snip ..
fin.read((char*)&myfilestruct, sizeof(MyFileStruct));

只是想如果在这个简单的场景中是否会出现任何问题,可能是在另一个操作系统或 32/64 位架构中。等等。那么,确切地说,什么时候会考虑位封装顺序?

最佳答案

对于该特定结构,您最有可能遇到的问题是字节顺序。在小端系统上,int 的最低寻址字节包含 least 有效 8 位。在大端系统上,最重要的 8 位。

因此,如果您将该结构的字节写入一种系统上的文件,将文件传输到另一种系统,然后读回,那么您将在 data2< 中看到不同的值.

但是,对于其他结构或不寻常的系统/编译器,您可能会遇到其他问题:

  • 基本类型的大小 - int 通常为 4 个字节,但不是必需的。 long 在不同的常见系统上有不同的大小(在 Windows 上为 4 个字节,在 64 位 Linux 上为 8 个字节)。显然,如果您尝试从文件中读取结构,并期望字节数与其他一些 C++ 实现实际写入的字节数不同,那么您就有问题了。
  • 填充 - 允许编译器将未使用的字节放入成员之间的结构中。这通常是为了确保对齐。例如,在许多编译器中,int 成员的偏移量始终是 4 的倍数。因为 40 在您的结构中无论如何都是 4 的倍数,这不会有任何区别,但是如果第一个数组是 39 个字节,那么对齐 int 的实现将插入一个未使用的字节,而没有对齐的实现则不会。在某些 CPU(例如 x86)上,对齐 int 很有用但不是必需的,在这种情况下,编译器通常有办法注释结构以说明是否填充它。

由于存在这些差异,将结构直接写入文件(或套接字)通常是不合法的。在任何读取它的人对该结构具有完全相同的内存表示的特定情况下,您可以摆脱它,这意味着如果您首先准确计算出哪些字节去哪里有什么意义,然后确保所有需要读/写文件的程序可以使用该格式。

关于c++ - 什么时候会出现结构包装问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com