結構體是由一批資料組合而成的一種新的自定義型別。
內建型別不能表示所有的場景,比如:學生群體;描述學生:name、age、gender、height。
(1)為什麼需要記憶體對齊?struct student
;
1、平台原因(移植原因):
不是所有的硬體平台都能訪問任意位址上的任意資料;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2、效能原因:
資料結構(尤其是棧)應該盡可能地在自然邊界上對齊;
原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶體訪問僅需要一次。
(2)如何進行記憶體對齊?
這裡分為兩大步驟:
1、使結構體中每個成員變數都處在對齊的位址上:
a、結構體中的第乙個成員變數在偏移量為0的位址上;
b、剩餘的變數,對齊規則:min(該變數型別,預設對齊數),然後檢測該變數相對於結構體起始位置的偏移量是不是該min的整數倍。不是的話,需要在該變數之前補齊位元組數。
2、讓結構體整體對齊:
使得結構體大小為 min(結構體成員變數型別最大者,預設對齊數)的最小整數倍。
(3)求結構體中某個成員變數相對於結構體起始位置的偏移量?
offsetof(結構體型別, 成員名字)
模擬實現該巨集:
位段為一種資料結構,可以把資料以位的形式緊湊的儲存,並允許程式設計師對此結構的位進行操作。#define offsetof(s, m) (size_t)&(((s*)0)->m)
//讓編譯器將0號位址單元開始的一塊記憶體作為s的結構體進行解析。
位段的好處:
跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間。
位段的缺點:
位段的記憶體分配與對齊的實現方式依賴於具體的機器和系統,在不同的平台可能有不同的結果,這導致了位段在本質上是不可移植的。
位段記憶體對齊:
a、前後型別相同,位元位能共用則共用,否則重新開闢對應型別的空間;
b、前後型別不一致,重新開闢空間。
聯合體也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員共用同一塊記憶體空間。
聯合的特點:
聯合的成員共用同一塊空間,這樣乙個聯合變數的大小,至少是最大成員的大小。
聯合大小的計算:
為什麼有大小端?
因為在計算機系統中,我們是以位元組為單位的,每個地質單元都對應著乙個位元組,乙個位元組位8bit,但是在c語言中除了8bit的char之外,還有16bit的short、32bit的long(具體看編譯器),對於位數大於8位的處理器,由於暫存器大於乙個位元組,那麼必然存在乙個如何將多個位元組安排的問題,因此就導致了大端儲存模式和小端儲存模式。
大小端跟作業系統是否有關係?
跟作業系統沒有關係,cpu是大小端儲存的決定因素。
如何測試乙個機器為大端還是小端?
//利用聯合體判斷
intcheck_sys()
un; un.i =1;
return un.c;
}int
main()
else
system
("pause\n");
return0;
}
C語言結構體
1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...
C語言 結構體
宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...
c語言 結構體
1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...