結構體在春村過程中會有「記憶體對齊」的要求。在計算結構體大小的時候,謹記兩條規則:
1、上面定義的常量或者變數型別占用的記憶體大小是下面定義的倍數;
2、計算出的最終值能否整除當前結構體中最大的資料型別。
計算下列結構體的大小:
1、
struct a
;//8
int 型別的常量占用4個位元組,兩個int型的占用8個位元組。2、
struct b
;//8
char型別占用乙個位元組,int型別占用4個位元組,常規思路會認為占用5
個位元組,然而並不是。這裡用到第一條規則:上面定義的常量或者變數型別占用的記憶體大小是下面定義的倍數。原因如下:
由於要保證儲存過程中記憶體對齊,系統將會將三個位元組的記憶體捨棄,而選擇從104這個4的倍數的記憶體下標開始儲存b.
3、
struct c
;//5+3,最終的值能整除單個最大資料型別
如果先定義的是整型型別,其占用4 個位元組;再定義char型別
其占用1個位元組。按照常規思維模式會認為此結構體一共占用5個位元組,但事實上它占用8個位元組。這時候由於「記憶體對齊」應考慮第二條規則:計算出的最終值能否整除當前結構體中最大的資料型別。
4、
struct d
;struct e
;//12
char a;//1+1short b;//2int c;//4};//8
char型別占用1個位元組,但是下面的short型別占用兩個位元組,為了保證記憶體對齊,常量a的下乙個單元記憶體會被空出;而char型別和short型別以及空出的單元記憶體一共為4位元組,剛好是下面int型別所需記憶體大小的倍數,這樣結構體d所占用的記憶體大小就是8位元組。
5、
struct m
;//24
與結構體d的計算方法相同,需要注意的是,short型別占用2個位元組是char型別的兩倍,但是char與short型別共佔3個位元組不是下乙個double型別的倍數,這個時候系統就會將下面的五個單元記憶體空出,再儲存double型別常量。
6、
struct ee
;struct e
;//12
struct f
;//16
結構體大小的計算方法
結構體大小計算方法 例項驗證 gcc更改對齊選項 char 1個位元組 char 即指標變數 4個位元組 32位的定址空間是2 32,即32個bit,也就是4個位元組 shortint 2個位元組 int 4個位元組 unsigned int 4個位元組 float 4個位元組 double 8個位...
結構體大小計算方法
原文 結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 實際上,由於儲存變數時位址對齊的要求,編譯器在編譯程式時...
結構體字長計算方法
計算方法 運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小...