當前位置:
首頁 >
结构体内存对齐
發布時間:2023/12/20
52
豆豆
結構體內存對齊
先看兩段代碼,兩段代碼僅順序不同,其結果輸出就出現了不同。
struct S {char c1;//1 8 1int i;//4 8 4char c2;//1 8 1 };struct S2 {char c1;char c2;int i; };int main() {struct S s = { 0 };struct S2 s2 = { 0 };printf("%d\n", sizeof(s));//12printf("%d\n", sizeof(s2));//8return 0; }接下來對其中的S進行單獨分析:
struct S {char c1;//1int i;//4char c2;//1 };int main() {struct S s = { 0 };printf("%p\n", &s);//002FFED8printf("%p\n", &(s.c1));//002FFED8printf("%p\n", &(s.i));//002FFEDCprintf("%p\n", &(s.c2));//002FFEE0return 0; }結構體內存對齊的規則:
1.結構體的第一個成員永遠都對齊到結構體的起始位置處。
2.從第二個成員開始,每個成員都對齊到某個對齊數的整數倍處。
對齊數:成員自身大小和默認對齊數的較小值
默認對齊數:VS-8 Linux-gcc-4
3.結構體的總大小是所有成員中最大對齊數的整數倍。
是一種以空間換時間的做法。
4.嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
為什么存在內存對齊:
offsetof—計算偏移量
1.頭文件:#include<stddef.h>
2.
3.宏參數無類型
\為續行符(將一行拆成兩行) 也可以看成轉義字符
后面加什么就轉義什么
直接敲回車–轉義回車
僅僅通過更換成員順序,就可以改變所占字節大小,那在設計結構體的時候,我們既要滿足對齊,又要節省空間,應該:
1.讓占用空間小的成員盡量集中在一起。
2.修改默認對齊數
總結
- 上一篇: 《开源公开课分享》:Java开源框架案例
- 下一篇: linq中给字段添加别名