記憶體位元組對齊

2021-10-06 08:52:33 字數 2027 閱讀 6650

1. 什麼是記憶體位元組對齊

計算機中記憶體空間都是按位元組劃分的,從理論上講對任何型別的變數的訪問可以從任何位址開始,但是在程式實際編譯過程中,編譯器會對資料型別在編譯過程中進行優化對齊,編譯器會將各種型別資料按照一定的規則在空間上排列,而不是順序的排放,這就是記憶體位元組對齊。

2. 為什麼要記憶體位元組對齊

不同硬體平台對儲存空間的處理是不同的。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如某些架構的cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊。其他平台可能沒有這種情況,但是最常的情況是,如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為32位系統)如果存放在偶位址開始的地方,那麼乙個讀週期就可以讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit資料,這樣資料讀取效率就會很差。

3. 如何實現記憶體位元組對齊

3.1基本資料型別的自然邊界對齊

各種資料型別的自然邊界對齊值如下:

3.2對齊的規則

為結構體分配記憶體時,分配的記憶體大小至少是各個欄位的長度和。通常,分配的結構體的長度會大於結構體各個欄位的長度和,因為結構體需要對齊,即結構體各字段之間需要填充。

預設情況下,編譯器為結構體的每個成員按其自然邊界對齊方式分配空間,按照每個成員被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構體的位址相同。結構體整體的預設位元組對齊值是結構體中的所有成員中對齊引數最大的乙個的值,結構體長度的計算必須取所用過的所有對齊引數的整數倍

結構體整體對齊方式取決於結構體中所有成員的自然邊界對齊值的最大值和指定對齊值兩者中最小的值。

3.3如何指定對齊方式

__attribute__ ((packed)); //取消結構在編譯過程中的優化對齊。

__attribute__ ((aligned (n))); //讓所作用的結構體、類的成員對齊在n位元組自然邊界上,如果結構中有成員的長度大於n,則按照機器字長來對齊。n=1,2,4,8,16…

這裡強調下取消編譯過程中的對齊優化:

__attribute__ ((packed)); //取消結構在編譯過程中的優化對齊。
無論是linux中的gcc,還是windows中的vc編譯器,都是非緊湊模式的編譯器,預設有位元組對齊的優化。前面我們講過不同平台關於位元組對齊的處理可能是不同的,因此在涉及到跨平台通訊時,不同的位元組對齊方式,可能引起資料解讀的問題。

取消編譯過程中的優化正是應用在這樣的場合,它使得資料成員間緊湊排列,而不會去對齊優化。下面進行舉例說明

4.例子

#include struct tst1

;struct tst2

__attribute((aligned(4)));

struct tst3

__attribute((aligned(8)));

struct tst4

__attribute((packed));

struct tst5

;__attribute((aligned(4)));

int main(void)

結果如下:

[fiona@fiona test]$ gcc attribute.c -o attribute

[fiona@fiona test]$ ./attribute

sizeof(struct tst1):8

sizeof(struct tst2):8

sizeof(struct tst3):8

sizeof(struct tst4):7

sizeof(struct tst5):12

5.參考

記憶體位元組對齊

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

記憶體位元組對齊

之前對記憶體位元組序知道一些,但是一直沒有系統的學習過,導致有時候還是說不清楚的,今天在網上查到一些自己,學習了下,並驗證了,特意給大家分享下,希望對大家能有幫助 總的來說就三條原則 在沒有 pragma pack巨集的時候 1 資料成員對齊規則,在結構體 struct 中,第乙個資料成員從0開始,...

記憶體位元組對齊

在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...