文章目錄
- __attribute__((aligned(x)))詳細介紹
- 其它對齊方式
上篇文章:ARM 嵌入式 編譯系列 11 – GCC attribute((packed))詳細介紹
attribute((aligned(x)))詳細介紹
__attribute__((aligned(x)))
是 GCC 編譯器的一個特性,它可以用于變量或類型,用來指定它們在內存中的對齊方式。
默認情況下,編譯器會對數據按照特定的對齊原則進行對齊,以提高處理器對數據的訪問效率。例如,一個 int
類型的變量在大多數系統上默認會按照 4
字節對齊。
使用 __attribute__((aligned(x)))
可以指定變量或類型的對齊方式,其中 x
是對齊的字節數,必須是 2
的冪次。編譯器將保證變量或類型的地址是指定字節數的倍數。
以下是一個示例:
#include <stdio.h>struct aligned_struct
{ char a; int b;
} __attribute__((aligned(16))); int main(void)
{ struct aligned_struct s; printf("Size of aligned_struct: %lu\n", sizeof(struct aligned_struct)); printf("Address of s: %p\n", &s); return 0;
}
在這個示例中,aligned_struct
結構體使用 __attribute__((aligned(16)))
指定了 16
字節的對齊方式。因此,它的大小是成員 char a
和 int b
的大小的總和,沒有額外的填充字節。同時,aligned_struct
的地址將是 16
的倍數。
ThinkStation-T350 (*^~^*) ~/workbase/test> gcc test2.c
ThinkStation-T350 (*^~^*) ~/workbase/test> ./a.out
Size of aligned_struct: 16
Address of s: 0x7ffe938d4ba0
通過指定對齊方式,可以確保特定類型的數據在內存中按照要求的邊界對齊,提高處理器對數據的訪問效率。
但是請注意,如果對齊方式超過硬件和操作系統的支持范圍,可能會導致編譯錯誤。
其它對齊方式
在GCC中,你可以使用 -fpack-struct
和 -falign-*
系列選項來指定編譯時的對齊方式。
-fpack-struct[=n]
:這個選項會指定結構體的對齊方式。如果沒有給出 n
,結構體將被緊湊打包,即沒有對齊。如果給出了 n
,則所有的結構體成員都將按 n
字節對齊。
例如:
gcc -fpack-struct=1 -o myprogram myprogram.c
這個命令將使 myprogram.c 中的所有結構體成員都按1
字節對齊。
-falign-functions=n
:這個選項會指定函數代碼的對齊方式,n 是對齊的字節數,必須是2
的冪次。
例如:
gcc -falign-functions=4 -o myprogram myprogram.c
這個命令將使 myprogram.c 中的所有函數的代碼都按4字節對齊。
注意:在大多數情況下,你應該讓編譯器使用默認的對齊方式,除非你有特別的需要。更改默認的對齊方式可能會影響代碼的性能和兼容性。
上篇文章:ARM 嵌入式 編譯系列 11 – GCC attribute((packed))詳細介紹