引子
#inlcude<stdio.h>
struct s{int i;char a:
};
struct s sVar = {5,'A'};
int main(void){printf("%d\n",sizeof(sVar));
}
問1:上面這個代碼的輸出結果是多少?
答1:
思考
明明sVar這個結構體就兩個元素,5和’A’,一個是int型占4個字節,一個是字符型占1個字節,那為什么這里卻輸出8,說這個sVar結構體占了8個字節呢?
字節對齊
原因就是要想提高cpu在讀取內存的速度,就需要有規律的存儲數據,確保數據結構在內存中的存儲地址是某個數(4,8的倍數),因為cpu讀取是按塊進行的,例如四字節一讀,八字節一讀
即便一個int加上一個char本應只占5字節的數據,也會通過字節補齊占8個字節。
內存優化
代碼一:
#inlcude<stdio.h>
struct s{int i;int j;char b;char a:
};
struct s sVar = {5,6,'B','A'};
int main(void){printf("%d\n",sizeof(sVar));
}
代碼二:
#inlcude<stdio.h>
struct s{int i;char a:int j;char b;
};
struct s sVar = {5,'A',6,'B'};
int main(void){printf("%d\n",sizeof(sVar));
}
問2:代碼一和代碼二的輸出結果分別是多少?
答2:12和16
讓我們看一看各自的匯編代碼
代碼一匯編:
align 為8
占用size 12字節
代碼二匯編:
align 為16
占用size 16字節
這個例子也告訴我們在定義數據的時候,應該有順尋,使得內存得到最大化的利用