3

我在 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 字节对齐的地址来满足。基本上,什么控制结构的对齐?请注意,我很清楚结构中字段的填充概念。我发现结构本身的对齐要求令人困惑。

4

1 回答 1

6

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

于 2012-04-12T12:30:41.747 回答