我们可以对结构布局进行假设吗?

本文关键字:假设 布局 结构 我们 | 更新日期: 2023-09-27 18:10:41

是否有任何约定的算法用于使C结构的布局?

我想能够有一个代码运行在一个虚拟机能够有结构兼容他们的C对应物,就像c#互操作的作品。为此,我需要知道对齐算法是如何工作的。我想这一定有一个约定,因为它在c#上工作得很好。我想到了他们用来解决这个问题的可能算法,但我还没有找到任何证据证明它是正确的。

我认为它是这样工作的:

每个已声明的字段(按声明顺序)

  • 查看该字段是否适合剩余的字节(直到下一次对齐)
  • 如果不合适,请对齐此字段;否则将其添加到当前偏移量
例如,在32位系统上,对于如下结构体:
{
byte b1;
byte b2;
int32 i1;
byte b3;
}

将像这样使用这个算法:

{
byte b1;
byte b2;
byte[2] align1;
int32 i1;
byte b3;
byte[3] align2;
}

我们可以对结构布局进行假设吗?

一般来说,C中的结构对齐取决于所使用的编译器,特别是在处理结构声明时有效的编译器选项。你不能做任何一般的假设,只能说对于用特定设置编译的特定程序中的特定结构,可以确定结构布局。

也就是说,您的猜测与大多数编译器可能默认对齐设置的操作非常接近。