【发布时间】: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)”字节对齐地址处对齐。