1. 程式人生 > >__align(n)、#pragma pack(n)和__attribute__((aligned(m)))的區別

__align(n)、#pragma pack(n)和__attribute__((aligned(m)))的區別

__align :關鍵字指示編譯器 n 位元組邊界上對齊變數。是一個儲存類修飾符。它不影響函式的型別。
__align(n)由於 __align 是儲存類修飾符,因此不能將其用於:
          型別,包括 typedef 和結構定義函式引數。
          只能進行過對齊。也就是說,可以將兩個位元組的物件按 4 個位元組對齊,而不能將 4 個位元組的物件按兩個位元組對齊。

pragma pack(n):告訴編譯器結構體或類內部的成員變數相對於第一個變數地址的偏移量的對齊方式,預設情況下,編譯器按照自然邊界對齊,當變數所需的自然對齊邊界比n大 時,按照n對齊,否則按照自然邊界對齊;


__attribute__((aligned(m)))

:告訴編譯器一個結構體或者類或者聯合或者一個型別的變數(物件)分配地址空間時的地址對齊方式
也就是說,如 果將__attribute__((aligned(m)))作用於一個型別,那麼該型別的變數在分配地址空間時,其存放的地址一定按照m位元組對齊(m必 須是2的冪次方)。並且其佔用的空間,即大小,也是m的整數倍,以保證在申請連續儲存空間的時候,每一個元素的地址也是按照m位元組對齊。 
__attribute__((aligned(m)))也可以作用於一個單獨的變數。


: pragma作用於結構的成員變數;attribute ((aligned(n)))作用於結構體分配地址的對齊方式 和 結構體的大小。