結構體計算要遵循位元組對齊原則
結構體預設的位元組對齊一般滿足三個準則:
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)
其實 暫且不管這三原則,我的方法只要記住第三個,就是結構體大小結果要為成員中最大位元組的整數倍
先看下面定義的兩個結構體.
struct s1;
struct s2;
分別用程式測試得出sizeof(s1)=6 , sizeof(s2)=4
注意 為什麼 僅僅改變了結構體成員的順序,結果不一樣?
解:(1)首先找出成員變數中最大的位元組,可見對於s1和s2 最大是short ,佔2個位元組,
(2)所以以後都已2個位元組為準,也就是說最多只要2個位元組,其他填充佔位,注意下圖乙個格仔表示乙個位元組,
(3)所以先畫2個格仔,以後看成員順序,逐次增加,每次一2為增加基準
對於s1 ,來說,順序是 char->short->char
2個位元組
第乙個char佔乙個位元組
多的這乙個補0,只是佔位作用
short 剛好佔2個位元組
第二個char也佔1個
多的這乙個補0
所以對於s1結構體大小為 2*3=6,至於為什麼第二個char,多的那個位元組不丟到,就是遵循第三個原則,就是結構體大小結果要為成員中最大位元組的整數倍
對於s2 嘛,也畫個圖,但是順序是 char->char->short
第乙個char佔乙個位元組
第二個char佔乙個位元組
short 剛好佔2個位元組
s2=2*2=4
按照這個方法再看這樣的乙個結構體:
struct stu1
;很明顯:最大位元組為4個。順序int char int
stu1
intintint
intchar00
0第二個int
intint
int
因為 int佔4個,而char已經咱了乙個,不夠,所以那三個只能多餘佔位
stu1=3*4=12
那麼換一下呢?
struct stu2
;stu2=3*4=12;
再看乙個:就是當結構體成員變數是另外乙個結構體時,只要把結構體中成員為另一結構體作為整體相加就行
typedef struct a
;a=16
typedef struct b
;而對於b,先不要管a a,也就是先去掉a a 成員結構體b 算得 其為8,所以最後結果為8+16=24;踩
sizeof的詳盡計算結構體位元組數方法
本文主要包括二個部分 第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法。第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...
sizeof的詳盡計算結構體位元組數方法
本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...
sizeof的詳盡計算結構體位元組數方法
本文主要包括二個部分,第一部分重點介紹在 vc中,怎麼樣採用 sizeof 來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中 sizeof 的主要用法。1 sizeof 應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct 採用si...