獲取結構體位元組數簡單的方法

2021-07-22 09:50:23 字數 1418 閱讀 8954

結構體計算要遵循位元組對齊原則

結構體預設的位元組對齊一般滿足三個準則:

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...