结构体内存对齐
結(jié)構(gòu)體內(nèi)存對齊
先看兩段代碼,兩段代碼僅順序不同,其結(jié)果輸出就出現(xiàn)了不同。
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; }結(jié)構(gòu)體內(nèi)存對齊的規(guī)則:
1.結(jié)構(gòu)體的第一個成員永遠(yuǎn)都對齊到結(jié)構(gòu)體的起始位置處。
2.從第二個成員開始,每個成員都對齊到某個對齊數(shù)的整數(shù)倍處。
對齊數(shù):成員自身大小和默認(rèn)對齊數(shù)的較小值
默認(rèn)對齊數(shù):VS-8 Linux-gcc-4
3.結(jié)構(gòu)體的總大小是所有成員中最大對齊數(shù)的整數(shù)倍。
是一種以空間換時間的做法。
4.嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
為什么存在內(nèi)存對齊:
offsetof—計算偏移量
1.頭文件:#include<stddef.h>
2.
3.宏參數(shù)無類型
\為續(xù)行符(將一行拆成兩行) 也可以看成轉(zhuǎn)義字符
后面加什么就轉(zhuǎn)義什么
直接敲回車–轉(zhuǎn)義回車
僅僅通過更換成員順序,就可以改變所占字節(jié)大小,那在設(shè)計結(jié)構(gòu)體的時候,我們既要滿足對齊,又要節(jié)省空間,應(yīng)該:
1.讓占用空間小的成員盡量集中在一起。
2.修改默認(rèn)對齊數(shù)
總結(jié)
- 上一篇: 《开源公开课分享》:Java开源框架案例
- 下一篇: linq中给字段添加别名