2017-02-14 20 views
1

我正在閱讀一本關於編譯器設計和實現的書。在關於存儲管理的部分,作者寫了一個函數來分配內存。他希望函數適合任何類型。他聲稱下面的聯盟的大小是主機上的最小對齊。我不太明白這是什麼意思。從這本書中:「......它的領域是那些最有可能具有最嚴格的對齊要求的領域。」機器的最小對齊要求

union align { 
    long l; 
    char *p; 
    double d; 
    int (*f) (void); 
}; 

有人可以解釋'最嚴格的對齊要求'是什麼意思,這是如何給主機上的最小對齊?

回答

4

選擇聯合的對齊方式與具有最大對齊要求的成員的對齊方式相同。它的大小選擇爲與最大成員一樣大,並在最後加上一些額外的填充以確保當按順序排列在數組中時對齊不會中斷。

所以在這個意義上說,union align將有相同的對齊方式要麼lpdf(取具有最大的對齊要求)。

例如,如果f構件是int (*)(void)類型的具有8的對齊要求,整個聯合將一個8字節邊界上對齊,即使long僅需要4

我不太確定標準是否保證這4種類型的最大對齊要求是「主機上的最小對齊」。爲了理解編譯器在存儲管理方面的工作方式,這可能只是一個很好的練習。

3

考慮一臺由於內存總線限制只能從偶數地址讀取16位值的機器。

這樣一臺機器上的一個16位值將有2

的「對齊要求」不要依靠union掛羊頭賣狗肉。由於C11,主要有:

  • max_align_t這是同義到最大(標準)標量類型用於平臺(1),即具有如通過malloc()服務的對準的類型。
  • _Alignof,它給出了給定類型的對齊要求。
  • alignas,它允許修改類型的對齊。

(1):最大的該類型將通常long double,類型從你的書的例子可疑缺席...

注意,編譯器可能支持「擴展」類型的需要進行特殊處理。例如,具有256字節的SSE數據類型,但只有malloc()「執行128字節對齊。