2012-04-12 106 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