結構體大小其實包含了乙個知識點:記憶體對齊
我們先記住以下四條記憶體對齊的規則:
1.第乙個成員在與結構體變數偏移量為0的位址處。
2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所 有最大對齊數(含巢狀結構體的對齊數)的整數倍。
注意:對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。
vs中預設的值為8
為什麼存在記憶體對齊?
效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器 需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
總體來說:結構體的記憶體對齊是拿空間來換取時間的做法
說了這麼多,我們來舉個例子吧:
#define _crt_secure_no_warnings
#include#includestruct studentxiaoming;
int main()
如圖,如果緊湊排列的話,我們這個結構體的大小應該是17;但我們執行的結果卻是 32下面我們就來分析一下:
a的偏移量為0,也就是說它在結構體內存的開端;
b的對其值為2,vs預設8,它的位置要放在2的整數倍上(偏移量為2的整數倍),81不行,故空一格,從82開始;
c的對其值為1,vs預設8,選取1,故c從84開
d的對其值為4,vs預設8,選取4,則要是4的倍數(偏移量為4的整數倍),故空3格,故d從88開。
e的對其值為8,vs預設8,選取8,故e從90開
f為char,選取1,但是不滿足規則三(最大對其數的整數倍),只能取8的倍數,那也就是32,也就是說25之後的7的位元組為空。
綜上所述,總位元組數為32.
這樣最終的結果就是17,因為每乙個都是挨著放,直接相加就行了。
C語言詳解 結構體
1.什麼是結構體?結構體是一種工具,用這個工具可以定義自己的資料型別。2.結構體與陣列的比較 1 都由多個元素組成 2 各個元素在記憶體中的儲存空間是連續的 3 陣列中各個元素的資料型別相同,而結構體中的各個元素的資料型別可以不相同 3.結構體的定義和使用 1 一般形式 struct 結構體名 st...
c語言的結構體詳解
什麼是結構體?簡單的來說,結構體就是乙個可以包含不同資料型別的乙個結構,它是一種可以自己定義的資料型別,它的特點和陣列主要有兩點不同,首先結構體可以在乙個結構中宣告不同的資料型別,第二相同結構的結構體變數是可以相互賦值的,而陣列是做不到的,因為陣列是單一資料型別的資料集合,它本身不是資料型別 而結構...
C語言的結構體詳解
結構體 struct 1 定義 一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。下面舉乙個例子來說明怎樣定義結構變數。struct string person 這個例子定義了乙個結構名為string的結構變數person,如果省略變數名 person,則變成對結構的申明...