C語言位元組對齊

2022-09-06 22:15:19 字數 2237 閱讀 7414

什麼是位元組對齊?

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。

為什麼要位元組對齊?

位元組是否對齊關係到cpu訪問資料時的效率問題,假設乙個cpu每次總是從記憶體中取出4個位元組,從記憶體編號為0的地方開始,現在我定義乙個char a,定義乙個int b,讓他們按順排列在記憶體中,就是這樣的:

char a占用1個位元組,int a占用4個位元組,cpu每次總是取4個位元組,這時我想要取b時,需要先取出0-3,再取出4-7,然後將1-4拼在一起,這樣就需要取兩次,但是,如果我讓char aint b按照特定的順序排列:

這樣我只需要取一次就能將b取出,提公升了cpu的工作效率。

位元組對齊的概念和規則

概念:

規則:

有效對齊值n是最終用來決定資料存放位址方式的值,最重要。

有效對齊n,就是表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0"。而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是資料結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整。

舉例說明

**如下

#include struct test

;int main(void)

; printf("%d \n",sizeof(t));

getchar();

return 0;

}

如果我們不知道位元組對齊規則,那麼一定會認為這個結構體的大小是這樣的,char型別1個位元組,int型別4個位元組,short型別2個位元組一共7個位元組,執行一下看看結果:

執行之後的結果是12,我們先來看一下反彙編**:

根據反彙編**我們可以看到a,b,c中的值分別存放在ebp-0ch,ebp-8,ebp-4這三個地方,我們到記憶體中看一下他們是怎麼排列的:

可以看到char占用1個位元組,int占用4個位元組,short占用2個位元組,但是並沒有我們想象的那樣緊挨著排放,而是有一定的排放規則。這裡就體現出了位元組對齊,因為我這裡是32位的機器,預設是4位元組對齊,下面來詳細的說一下是怎麼排列的:

假設基址為0012ff3c,從偏移位址為0的位置開始存放

這樣,a占用1個位元組,存放在偏移位址為0的記憶體,0%1=0,沒有問題。

b占用4個位元組,如果將他挨著變數a存放,也就是存放在偏移位址為1的位置,1%4=1,這樣就存在問題了,所以b存放到偏移位址為4的位置,4%4=0。

最後,c占用2個位元組,如果將他挨著b存放,也就是存放到偏移位址為8的位置,8%2=0,沒有問題,所以c存放到 偏移位址為8的位置,佔兩個位元組。

這樣就排列好了,這時,發現a,b,c一共才占用了10個位元組,因為結構體還沒有根據自身有效對齊值圓整,根據上面的分析,這個結構體的自身對齊值是4,12%4=0,所以結構體會再占用兩個位元組,10和11,也就是a和b,這樣就得出這個結構體的實際大小是12。

當然,除了使用預設的對齊值,我們還可以自己使用#pragma pack (value)指定對齊值:

#include #pragma pack (2)

struct test

;int main(void)

; printf("%d \n",sizeof(t));

getchar();

return 0;

}

這將對齊值設定成2,那麼a,b,c在記憶體中的排列方式應該是這樣的:

要注意,這裡的int b的自身對齊值是4位元組,有效對齊值是2位元組。

c語言位元組對齊

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...

C語言位元組對齊

一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...

C語言位元組對齊

一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...