【问题标题】:struct alignment on a 64-bit machine64位机器上的结构对齐
【发布时间】:2012-04-12 20:30:41
【问题描述】:

我在 64 位 Linux 机器上有以下结构。

struct __wait_queue_head {
          spinlock_t lock;
          struct list_head task_list;
  };

where

typedef struct {
          raw_spinlock_t raw_lock;
  } spinlock_t;

and

struct list_head {
          struct list_head *next, *prev;
  };

raw_spinlock_t is defined as:

typedef struct {
          volatile unsigned int slock;
  } raw_spinlock_t;

现在我想了解 struct __wait_queue_head 在遵循 LP64 标准的 64 位 Linux 机器上的对齐方式。据我所知,自从这个结构的第一个字段即。

spinlock_t lock

是一个无符号整数,在 64 位机器上占用 4 个字节,这个结构应该从一个 4 字节对齐的地址开始。但是,我已经看到在真实系统上并非如此。相反,结构从 8 字节对齐的地址开始,尽管第一个字段的对齐要求已经被 4 字节对齐的地址满足。基本上,什么控制结构的对齐?请注意,我很清楚结构中字段的填充概念。我发现结构本身的对齐要求令人困惑。

【问题讨论】:

  • 如果我猜对了,是不是编译器将每个字段定位在 8 字节对齐以提高性能?寄存器是 64b,所以它们可以一次性加载..
  • 并非每个字段都是 8 字节对齐的。 unsigned short 等数据类型是 2 字节对齐的,unsigned int 是 4 字节对齐的。对于结构“外部”的变量,该变量应在“sizeof(variable)”字节对齐地址处对齐。

标签: c 64-bit alignment


【解决方案1】:

结构的对齐要求是其任何成员的最大对齐要求。在这种情况下,由于struct list_head 包含指针,struct list_head 的对齐方式为 8 个字节。由于struct __wait_queue_head 包含struct list_head,它的对齐方式也是8 个字节。这是必需的,因为如果结构具有较宽松的对齐要求,则结构填充不足以保证成员正确对齐。

【讨论】:

  • 您能否举例说明结构填充如何不足以正确对齐结构的所有数据成员? IMO,填充总是足以正确对齐数据成员。
  • @Gaurav 想象一个结构,它有一个 4 字节成员,后跟一个 8 字节成员。填充规则将在成员之间添加 4 个字节的填充。如果结构是 8 字节对齐的,那么两个成员都将是 8 字节对齐的,这就足够了。如果结构与 4 字节的 odd 倍数对齐,则第一个成员将 4 字节对齐,但第二个成员将由于填充而未对齐。在为结构的 all 实例提供相同内存布局的同时获得正确对齐的唯一方法是根据最大类型对齐。
  • 对不起,我还没有得到这个;但是即使一个结构与 4 个字节的奇数倍对齐,比如 12 个字节,那么为什么我们首先需要填充呢?第一个字段将占用 4 个字节,然后下一个字段可以从第 16 个字节开始,这是一个完美的 8 字节对齐地址。数据成员的对齐方式仍然正确。如果我错了,在哪里错了,请纠正我。
  • @gjain 假设 struct x {int y; long z;}; 是 12 字节对齐的,没有填充,(int)&((struct x *)0)->z 是 4,这是未对齐的
猜你喜欢
  • 2016-12-11
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2014-11-27
相关资源
最近更新 更多