一 原理
【原則1】結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)
【原則2】結構體大小必須是所有成員大小的整數倍。
結構體總大小等於最後乙個成員的偏移量加上其大小
二 例項
例1 計算結構體的大小
struct a
int a;
char b;
char c;
【解析】利用sizeof 計算,結果為8。記偏移量為ref,大小為size:
struct a
;
若不考慮位元組對齊,總大小為ref_c+size_c=6。根據【原則2】,6不是int型別大小的倍數,故補齊2,大小為8。
例2 計算結構體的大小
struct b
char a;
short b;
char c;
【解析】利用sizeof 計算,結果為6。記偏移量為ref,大小為size:
struct b
;
若不考慮位元組對齊,總大小為ref_c+size_c=5。根據【原則2】,5不是short型別大小(size_b=2)的倍數,故補齊1,大小為6。
例3 計算結構體的大小
struct c
int a;
char b;
short c;
【解析】利用sizeof 計算,結果為8。記偏移量為ref,大小為size:
struct c
;
總大小為ref_c+size_c=8,總大小滿足【原則2】不需要補齊。
【記憶體對齊的應用】
(1) 程式的可移植性
程式在不同的作業系統中移植,需要考慮記憶體對齊。
(2) 較少記憶體損失
在建立結構時,考慮位元組對齊,可以使結構盡可能占用少的記憶體。不對記憶體的成員進行重排以減小因對齊帶來的損失。
記憶體位元組對齊
一 什麼是對齊,以及為什麼要對齊 1.現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。2.對齊的作...
記憶體位元組對齊
之前對記憶體位元組序知道一些,但是一直沒有系統的學習過,導致有時候還是說不清楚的,今天在網上查到一些自己,學習了下,並驗證了,特意給大家分享下,希望對大家能有幫助 總的來說就三條原則 在沒有 pragma pack巨集的時候 1 資料成員對齊規則,在結構體 struct 中,第乙個資料成員從0開始,...
記憶體位元組對齊
在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...