編譯器與位元組對齊

2021-05-23 07:26:26 字數 976 閱讀 4926

編譯器版本

gcc 4.1.2

vc  6.0

上次研究了結構體和位元組對齊的問題,不過有個復合結構體有點奇怪。

#pragma pack(8)

struct s1

;struct s2

;#pragma pack()

在gcc下, sizeof(struct s2) = 20, 但在vc 6.0下卻是24!

其實,這個牽扯到了編譯器自身的預設對齊大小。gcc預設是按4位元組對齊的,vc 6.0預設是按8位元組對齊。但我們可以在程式中加入預編譯指令改變預設對齊大小。

#pragma pack(n)

...#pragma pack()

經過測試, 在gcc和vc 6.0中,當分別指定n值為1,2,4時,struct s2的大小相同,分別為15, 16, 20。n=1時, 空間最省,但訪問效率低了。但n=8時,gcc 計算的結果為20, vc 6.0計算的結果為24. 貌似使用#pragma pack(8)對gcc不起作用,還是按預設的4位元組對齊。在gcc官方**上

(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/structure_002dpacking-pragmas.html#structure_002dpacking-pragmas), 可看到gcc是為了與win32保持相容性才引入pragma預編譯指令的。不過,如果非要指定gcc按8位元組對齊也是有辦法的,可以使用__attribute__ ((aligned(8)))

struct s1

;struct s2

__attribute__ ((aligned(8)));

這樣,再計算sizeof(struct s2)時,就是24了。

GCC編譯器的位元組對齊

include 由於在x86 32位機器 平台下,gcc編譯器預設按4位元組對齊,如 結構體4位元組對齊,即結構體成員變數所在的記憶體位址是4的整數倍 可以通過使用gcc中的 attribute 選項來設定指定的對齊大小。1 attribute packed 讓所作用的結構體取消在編譯過程中的優化對...

關於C編譯器裡位元組對齊的問題

宣告 只是為了方便個人學習用 首先是來自http blog.csdn.wenddy112 articles 300583.aspx 通過 pragma pack n 改變c編譯器的位元組對齊方式 上的乙個問題 對於下面的結構體 struct test 結構各成員空間分配情況是怎樣的?文章中解釋 結構...

32 64位編譯器各型別大小和位元組對齊

32位編譯器 32位系統下指標占用4位元組 char 1個位元組 char 即指標變數 4個位元組 32位的定址空間是2 32,即32個bit,也就是4個位元組。同理64位編譯器 shortint 2個位元組 int 4個位元組 unsigned int 4個位元組 float 4個位元組 doub...