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

pri*_*ner 2 c gcc memory-alignment

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

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

memstruct *memstrx;
Run Code Online (Sandbox Code Playgroud)

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

memstrx=(void*)(0x502);
Run Code Online (Sandbox Code Playgroud)

所以

&memstrx[0]应该有一个值
&memstrx[1]0x502,0x51A
&memstrx[2],0x532

......依此类推.

但事情似乎并不正确.

相反,

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

... 等等等等.

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

Art*_*yom 6

不,不能做到.

您显示的结构的最小大小为8*4 = 32字节.

64位架构上的sizeof(unsigned long)= 8(Linux)

编辑:如果你愿意的话

- unsigned而不是unsigned long

要么

  • uint32_tuint64_t不是unsigned longunsigned long long

你会得到预期的对齐.

  • Artyom意味着`unsigned long`在64位机器上是8个字节.如果你想要32位,可以使用普通的`unsigned`,或者更好的是使用精确大小的类型(`uint32_t`和`uint64_t`)而不是大小不同的类型. (3认同)