2012-04-12 78 views
3

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

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; 

现在我想明白了结构__wait_queue_head的64位Linux机器上的LP64标准以下的对齐方式。从我所知道的,因为这个结构的第一个领域即。

spinlock_t lock 

是一个无符号的int,它占据着64位机器上的4个字节,这个结构应在4字节对齐地址开始。不过,我已经看到,真正的系统并非如此。相反,该结构始于8字节对齐地址,但第一个字段的对齐要求将通过4字节对齐地址来满足。基本上,管理结构的对齐是什么?请注意,我很清楚结构中字段的填充概念。结构本身的对齐要求是我发现混淆的。

+0

如果我明白你的意思,编译器会将每个字段放在8字节对齐的位置以提高性能?寄存器是64b,因此它们可以一次加载.. – fduff 2012-04-12 12:35:52

+0

并非每个字段都是8字节对齐的。像unsigned short这样的数据类型是2字节对齐的,而unsigned int是4字节对齐的。对于结构变量的“外部”,变量需要在'sizeof(variable)'字节对齐的地址对齐。 – gjain 2012-04-12 16:41:27

回答

6

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

+0

您能否举一个例子说明struct padding如何不能正确对齐struct的所有数据成员?国际海事组织,填充总是足以正确对齐数据成员。 – gjain 2012-04-12 13:56:45

+1

@Gaurav想象一下,一个具有4字节成员和8字节成员的结构。填充规则将在成员之间添加4个字节的填充。如果结构是8字节对齐的,那么两个成员将是8字节对齐的,这就足够了。如果结构对齐到4个字节的* odd *倍数,则第一个成员将是4字节对齐的,但由于填充,第二个成员将会错位。在给所有结构体的*所有*实例设置相同的内存布局时,唯一对齐方式是根据最大类型进行对齐。 – hobbs 2012-04-12 18:33:05

+0

对不起,我还没有得到这个;但即使一个结构对齐到4个字节的奇数倍,比如12个字节,那么为什么我们首先需要填充?第一个字段占用4个字节,然后下一个字段可以从第16个字节开始,这是一个完美的8字节对齐地址。数据成员的对齐方式仍然正确。如果我错了,请纠正我。 – gjain 2012-04-12 18:57:26