2

我正在将我们的应用程序从 solaris sparc 移植到 solaris x86,我遇到了这两种架构之间结构的大小差异。例如; 我有一个像

typedef struct mystructS
{
  double a;
  double b;
  double c;
  double d;
  double e;
  double f;
  double g;
  double h;
  double aa;
  double ab;
  double ac;
  double ad;
  double ae;
  double af
  double ag;
  double ah;
  int ba;
  int bb;
  int bc;
  char ca[256];
} mystructT;

sizeof(mystructT)当我在 solaris X86 中写入时,它返回 396

当我在 solaris SPARC 中写入sizeof(mystructT)时,它返回 400

我只是好奇,为什么会发生这样的事情?

编辑:两个 Solaris 系统都是 32 位的。

4

4 回答 4

4

For whatever reason (perhaps doubles need to be aligned on sparc and not on x86?) it appears it's trying to make sure the next struct is aligned on a 64 bit boundary.

That is, in order for you to jump sizeof(mystructT) steps in memory and still end up pointing to the beginning of your struct (for example, when creating an array of structs, this is what you'd be doing when iterating over it), the struct must be padded at the end.

于 2010-02-22T09:13:51.567 回答
2

如果 SPARC 是 64 位,编译器可能会尝试在边界上对齐 ca,这意味着它将在 bc 和 ca 之间填充额外的 4 个字节。如果是这种情况,您可能会要求编译器打包结构,以便它不会添加填充字节,但是您如何告诉它这样做往往有点依赖于编译器。

于 2010-02-22T09:06:31.893 回答
0

由于结构成员填充和对齐始终是实现定义的,因此您永远不应该对结构的大小做出任何假设(即使在同一平台上同一编译器的不同版本之间,或具有不同优化设置的同一编译器之间)。

如果您需要特定的对齐和打包,则必须使用编译器特定的指令来实现这一点。这可能是通过命令行编译选项、#pragma指令或在 GCC 和一些其他编译器__attribute__规范中。或者也许更健壮(但更多的工作)使用数据序列化。

于 2010-02-22T10:21:19.170 回答
0

最有可能的alignof(double)是,一个编译器是 8 个,另一个是 4 个。

double结构的对齐被编译为其字段对齐的最小公倍数,在这种特殊情况下,它意味着struct mystructS.

结构的大小必须是其对齐的倍数(如果您曾经制作过这样的结构的数组,这是为了让事情顺利进行)。因此,结构对齐为 8 的编译器也必须通过在末尾添加填充来将大小四舍五入为 8 的倍数。

于 2010-02-22T11:41:23.183 回答