在實際專案中,結構體和其他型別基礎
資料型別
一樣,結構體是大量存在的。結構體的大小不是結構體元素單純相加就行的,需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式如下:
1.每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍,否則在成員之前加上偏移量;
2.當前所以成員大小計算完畢,編譯器判斷當前結構提的大小是否為結構體中最大基本資料項的整數倍,如不是在最後乙個成員後做位元組填充。
struct stua//5
; struct stub//8
;
stua 中 name 為4個位元組,偏移量為0,*** 為1個位元組,偏移量為0,所有資料項計算結束,當前結構體大小為5,不填充,stua為5個位元組。
stub 中 num 為4個位元組,偏移量為0,*** 為1個位元組,偏移量為0,所有資料項計算結束,當前結構體大小為5,整體對齊時在 *** 之後填充3個位元組,stub為8個位元組。
stua,、stub雖然資料項的大小相同,但是基本資料項stua 為乙個位元組的char ,stub 為四個位元組的 int。
在實際的使用過程中還需要注意一下,不被sizeof計算的問題:
struct stuc//4
;
sizeof()只計算棧中分配的大小,而***為靜態變數是存放在全域性資料區,不計算在內。stuc 中 num 為4個位元組,偏移量為0,
當前結構體大小為4,不填充,stuc為4個位元組。
聯合體中的所有成員是共享一段記憶體的,因此每個成員的存放首位址相對於於聯合體變數的基位址的偏移量為0,即所有成員的首位址都是一樣的。
同一時間只能儲存1個被選擇的變數,對其他成員變數賦值會覆蓋原變數。
因此,聯合體的大小應為
1.容納下最大資料項的大小;2.能被所有的基本資料型別都能整數。
typedef union u//12
u;
u 中 arr 為9個 位元組大小,num 為4個位元組大小,因此 u 的大小為12個位元組。
關於類的記憶體大小,需要注意:
1.虛函式,編譯器需要為類構建虛函式表,類中需要儲存乙個指標指向虛函式表的首位址;2.靜態成員函式,類的所有例項共享,不被sizeof計算在內;
3.普通函式或靜態普通函式,都儲存在棧中,不被sizeof計算在內;
class a //12
;
根據記憶體對齊規則,funa() 和 funb()會構建虛函式表的首位址,4個位元組大小,偏移量為0,func()和fund()儲存在棧中,不被sizeof()計算,
si 為靜態成員函式,所有例項共享不被sizeof()計算,num 為4個位元組,偏移量為0,***為1個位元組,偏移量為0,資料項計算結束,當前類的大小為9,
整體對齊時,***之後填充3個位元組,a的大小為12個位元組。
參考文獻1:c語言結構體大小計算
參考文獻2:c語言sizeof求結構體大小問題彙總
結構體,聯合體,類的大小計算
includeusing namespace std struct s int main 該結構體中最大的型別是double,所以對齊符為8 1 首先分配8個位元組 2 int a 10 佔40個位元組 3 所以每兩個陣列元素申請8個位元組 4 直到申請5次 40個位元組 才將int a 10 全部...
結構體聯合體
在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...
聯合體結構體型別大小判斷
根據現有的各種資料,c c 中聯合體型別在記憶體中的大小預設以最長的為準,並以長度最長的型別對齊。按照上述原則 union a 在記憶體中所佔位元組數應為sizeof int 5 並使其以sizeof double 對齊,在32位或者64位系統平台上,sizeof a 的值應為24.不過程式 inc...