为什么要进行结构体内存对齐
###結構體內存對齊
####什么是結構體內存對齊
結構體不像數組,結構體中可以存放不同類型的數據,它的大小也不是簡單的各個數據成員大小之和,限于讀取內存的要求,而是每個成員在內存中的存儲都要按照一定偏移量來存儲,根據類型的不同,每個成員都要按照一定的對齊數進行對齊存儲,最后整個結構體的大小也要按照一定的對齊數進行對齊。
####對齊規則:
如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍(含嵌套結構體的對齊數)
特點
每個成員的偏移量%自己的對齊數=0;
結構體整體大小%所有成員最大對齊數=0;
結構體的對齊數是自己內部成員的對齊數中的最大對齊數
####舉例說明
#####案例一分析
char 類型占1個字節,編譯器默認對齊數為8,則該變量對齊數為1,實際偏移量為0
int 類型占4個字節,編譯器默認對齊數為8,則該變量對齊數位4,偏移量應該為4的倍數,實際偏移量為4
short類型占2個字節,編譯器默認對齊數為8,則該變量對齊數2,偏移量應該為2的倍數,實際偏移量為8
結構體整體的對齊數為所有成員的對齊數中最大的一個,對齊數為4
結構體整體大小,按照上面數據占據空間大小,計算得結構體大小10字節。
按照對其規則,應該對齊到4的倍數,實際大小為12字節
#####案例二分析
char 類型占1個字節,編譯器默認對齊數為8,則該變量對齊數為1,實際偏移量為0
short類型占2個字節,編譯器默認對齊數為8,則該變量對齊數2,偏移量應該為2的倍數,實際偏移量為2
int 類型占4個字節,編譯器默認對齊數為8,則該變量對齊數位4,偏移量應該為4的倍數,實際偏移量為4
結構體整體的對齊數為所有成員的對齊數中最大的一個,對齊數為4
結構體整體大小,按照上面數據占據空間大小,計算得結構體大小8字節。
按照對其規則,應該對齊到4的倍數,實際大小為8字節
####圖形分析
###為什么存在內存對其
####平臺移植型好
不是所有的硬件平臺都能訪問任意地址上的數據;某些硬件平臺只能只在某些地址訪問某些特定類型的數據,否則拋出硬件異常,及遇到未對齊的邊界直接就不進行讀取數據了。
####cpu處理效率高
從上圖可以看出,對應兩種存儲方式,若CPU的讀取粒度為4字節,
####其實結構體內存對齊是拿空間換取時間的做法。提高效率
總結
以上是生活随笔為你收集整理的为什么要进行结构体内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车日行灯做E-mark认证必须接受要工
- 下一篇: 突变点检测:Pettitt突变点检测(p