GCC隐式对齐问题。 (64位代码)

时间:2011-02-03 08:03:59

标签: c gcc memory-alignment

如何在gcc中明确禁用对定义变量的对齐?
拿这个代码:

typedef struct{
  unsigned long long offset;
  unsigned long long size;
  unsigned long type;
  unsigned long acpi;
}memstruct;

memstruct *memstrx;

这将定义一个大小为24字节的结构 我试过了:

memstrx=(void*)(0x502);

因此

&memstrx[0]的值应为0x502
&memstrx[1],0x51A
&memstrx[2],0x532

......等等。

但事情似乎并不正确。

相反,
&memstrx[1],显示地址0x522
&memstrx[2],0x542
&memstrx[3],0x55​​2

......依此类推。

我怀疑GCC已经隐式地将结构重新调整为32字节(从24字节),强制a(每个条目的64位对齐)。我真的不希望这种行为只适用于这种结构。我该如何告诉GCC不要对齐那个结构?

3 个答案:

答案 0 :(得分:6)

不,不能做到。

您显示的结构的最小尺寸为8 * 4 = 32字节。

64位体系结构(Linux)

sizeof(unsigned long)= 8

修改:如果您要使用

- unsigned代替unsigned long

  • uint32_tuint64_t代替unsigned longunsigned long long

你会得到预期的对齐。

答案 1 :(得分:2)

#pragma pack(x)可以更改GCC和MSVC上的结构对齐限制。

GCC使用LP64模型进行64位构建 - 这意味着长和指针是64位。您需要更改为32位字段的unsigned int,或者使用uint32_t和uint64_t来获得稳定的字段大小。

#pragma pack(1)

typedef struct{
  unsigned long long offset;
  unsigned long long size;
  unsigned int type;
  unsigned int acpi;
}memstruct;

#pragma pack()

答案 2 :(得分:1)

这是使用gcc控制对齐的一个选项:

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html