薦 記憶體位元組對齊

2021-06-01 06:40:23 字數 974 閱讀 9784

一 原理

【原則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...