遇到sizeof struct 怎麼計算?

2021-06-29 15:42:57 字數 1971 閱讀 5635

1、 sizeof應用在結構上的情況

請看下面的結構:

struct mystruct;

對結構mystruct採用sizeof會出現什麼結果呢?sizeof(mystruct)為多少呢?也許你會這樣求:

sizeof(mystruct)=sizeof(double) sizeof(char) sizeof(int)=13

但是當在vc中測試上面結構的大小時,你會發現sizeof(mystruct)為16。你知道為什麼在vc中會得出這樣乙個結果嗎?

其 實,這是vc對變數儲存的乙個特殊處理。為了提高cpu的儲存速度,vc對一些變數的起始位址做了」對齊」處理。在預設情況下,vc規定各成員變數存放的 起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。下面列出常用型別的對齊方式(vc6.0,32位系統)。

型別對齊方式(變數存放的起始位址相對於結構的起始位址的偏移量)

char

偏移量必須為sizeof(char)即1的倍數

int偏移量必須為sizeof(int)即4的倍數

float

偏移量必須為sizeof(float)即4的倍數

double

偏移量必須為sizeof(double)即8的倍數

short

偏移量必須為sizeof(short)即2的倍數

各 成員變數在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的位元組vc會自動填充。同時vc為了確保結構的大小為結 構的位元組邊界數(即該結構中占用最大空間的型別所占用的位元組數)的倍數,所以在為最後乙個成員變數申請空間後,還會根據需要自動填充空缺的位元組。

下面用前面的例子來說明vc到底怎麼樣來存放結構的。

struct mystruct;

為 上面的結構分配空間的時候,vc根據成員變數出現的順序和對齊方式,先為第乙個成員dda1分配空間,其起始位址跟結構的起始位址相同(剛好偏移量0剛好 為sizeof(double)的倍數),該成員變數占用sizeof(double)=8個位元組;接下來為第二個成員dda分配空間,這時下乙個可以分 配的位址對於結構的起始位址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變數占用 sizeof(char)=1個位元組;接下來為第三個成員type分配空間,這時下乙個可以分配的位址對於結構的起始位址的偏移量為9(8+1),不是sizeof (int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,vc自動填充3個位元組(這三個位元組沒有放什麼東西),這時下乙個可以分配的位址對於結構的起 始位址的偏移量為12(8+1+3),剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變數佔sizeof(int)=4個 位元組;這時整個結構的成員變數已經都分配了空間,總的占用的空間大小為:8 1 3 4=16,剛好為結構的位元組邊界數(即結構中占用最大空間的型別所占用的位元組sizeof(double)=8)的倍數,所以沒有空缺的位元組需要填充。 所以整個結構的大小為:sizeof(mystruct)=8+1+3+4=16,其中有3個位元組是vc自動填充的,沒有放任何有意義的東西。

下面再舉個例子,交換一下上面的mystruct的成員變數的位置,使它變成下面的情況:

struct mystruct;

這個結構占用的空間為多大呢?在vc6.0環境下,可以得到sizeof(mystruc)為24。結合上面提到的分配空間的一些原則,分析下vc怎麼樣為上面的結構分配空間的。(簡單說明)

複製**

struct mystruct; //所有成員變數都分配了空間,空間總的大小為1+7+8+4=20,不是結構的節邊界數(即結構中占用最大空間的型別所占用 //的位元組數sizeof (double)=8)的倍數,所以需要填充4個位元組,以滿足結構的大小為sizeof(double)=8的倍數。複製**

所以該結構總的大小為:sizeof(mystruc)為1+7+8+4+4=24。其中總的有7+4=11個位元組是vc自動填充的,沒有放任何有意義的東西。

sizeof struct 大小討論

2009 11 08 14 05 51 分類 c語言雜記 舉報 字型大小 訂閱 struct 結構大小和順序 progma pack引數有關係 針對位元組對齊,環境使用的gcc version 3.2.2編譯器 32位x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int...

sizeof struct 大小討論

struct 結構大小和順序 progma pack引數有關係 針對位元組對齊,環境使用的 gcc version 3.2.2 編譯器 32位 x86平台 為例。char 長度為1個位元組,short 長度為2個位元組,int 長度為4個位元組。struct 子項在記憶體中的按順序排列,在沒有 pr...

sizeof(struct)對齊方式

結構體是一種復合資料型別,通常編譯器會自動的進行其成員變數的對齊,已提高資料訪問的效率。在預設情況下,編譯器為結構體的成員按照自然對齊 natural alignment 條方式分配儲存空間,各個成員按照其宣告順序在儲存器中順序儲存。自然對齊是指按照結構體中成員size最大的對齊,在cl編譯器下可以...