記憶體對齊和記憶體補齊

2021-10-22 14:08:31 字數 2099 閱讀 3689

-記憶體對齊:第乙個資料成員放在offset為0的地方,對齊按照對齊係數自身所占用的位元組數中,兩者比較小的那個進行對齊。

-記憶體補齊在struct或者union資料成員完成各自對齊之後,struct或者union本身也要對齊,對齊按照對齊係數struct或者union中最大資料成員長度中比較小的那個進行。先區域性成員對齊,然後再全域性對齊。

效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。記憶體是一組一組讀取的(4個一組或8個一組讀取),為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問(資料存放在同乙個組只需要一次讀取,如果分散在不同的組,需要兩次讀取)。

struct one

struct two

問在#pragma pack(4)和#pragma pack(8)的情況下,結構體的大小分別是多少?

(1)針對#pragma pack(4)

struct one:

記憶體對齊:double 佔8個位元組(對齊係數是4,double佔據8個位元組,兩者取小的,所以對齊係數是4),偏移量從0開始,d佔據8個位元組。c佔據1個位元組(對齊係數是4,1和4兩者取最小值),c實際佔據第8個位元組。i佔據4個位元組(對齊係數就是4),下乙個位址為12為4的倍數,因此,i佔據從12-15的位元組。中間第9,10,11將被空出。

記憶體補齊:記憶體對齊係數為4,最大記憶體長度是8,因此下乙個記憶體位址位將按照4的倍數進行補齊,由於下乙個位址位是16,因此無需進行補齊。所以在#pragma pack(4)情況下,struct one所需記憶體為16位元組。

struct two:

記憶體對齊:c占用記憶體1個位元組(記憶體係數是4,對齊方式1和4取小),占用第0號記憶體。d占用記憶體是8個位元組(記憶體系統是4,8和4取小的,所以記憶體係數是4),d佔據記憶體位置為4-11,i佔4個位元組(記憶體對齊方式按照4的倍數),占用12-15位記憶體。中間的第1,2,3位址位將被空出。

記憶體補齊:記憶體對齊係數為4,最大記憶體長度是8,因此下乙個記憶體位址位將按照4的倍數進行補齊,由於下乙個位址位是16,因此無需進行補齊。所以在#pragma pack(4)情況下,struct two所需記憶體為16位元組。

(1)針對#pragma pack(8)

struct one:

記憶體對齊:double 佔8個位元組(對齊係數是8,double佔據8個位元組,記憶體對齊方式是8的倍數),偏移量從0開始,d佔據8個位元組。c佔據1個位元組(對齊係數是8,1和8兩者取小的值),c實際佔據第8個位元組。i佔據4個位元組(對齊係數就是8,8和4取小的值),下乙個位址為12為4的倍數,因此,i佔據從12-15的位元組。中間第9,10,11將被空出。

記憶體補齊:記憶體對齊係數為8,最大記憶體長度是8,因此下乙個記憶體位址位將按照4的倍數進行補齊,由於下乙個位址位是16,因此無需進行補齊。所以在#pragma pack(8)情況下,struct one所需記憶體為16位元組。

struct two:

記憶體對齊:c占用記憶體1個位元組(記憶體係數是8,對齊方式1和8取小),占用第0號記憶體。d占用記憶體是8個位元組(記憶體系統是8,所以記憶體係數是8),d佔據記憶體位置為8-15,i佔4個位元組(記憶體係數是8,所以對齊方式按照4的倍數),占用16-19位記憶體。中間的第1,2,3,4,5,6,7位址位將被空出。

記憶體補齊:記憶體對齊係數為8,最大記憶體長度是8,因此下乙個記憶體位址位將按照8的倍數進行補齊,由於下乙個位址位是20,並非8的倍數,因此需要進行補齊到第23位(記憶體位址位從第0號開始)。所以在#pragma pack(8)情況下,struct two所需記憶體為24位元組。

注:32位機器預設對齊係數是4位,64位機器預設對齊係數是8位。

union在記憶體中占用以最長的一致

記憶體對齊與補齊

首先我們先看看下面的c語言的結構體 相信學過彙編的朋友都很熟悉這張圖,這張圖就是cpu與記憶體如何進行資料交換的模型,其中,左邊藍色的方框是cpu,右邊綠色的方框是記憶體,記憶體上面的0 3是記憶體位址。這裡我們這張圖是以32位cpu作為代表,我們都知道,32位cpu是以雙字 dword 為單位進行...

C語言記憶體對齊和結構補齊

32位cpu是以雙字 dword 為單位進行資料傳輸的,因此我們的資料無論是8位或16位都是以雙字進行資料傳輸。比如,乙個int型別4位元組的資料如果放在上圖記憶體位址1開始的位置,那麼這個資料占用的記憶體位址為1 4,那麼這個資料就被分為了2個部分,乙個部分在位址0 3中,另外一部分在位址4 7中...

C語言記憶體對齊和結構補齊

首先我們先看看下面的c語言的結構體 cpp view plain copy typedef struct memalign memalign 以上這個結構體占用記憶體多少空間呢?也許你會說,這個簡單,計算每個型別的大小,將它們相加就行了,以32為平台為例,int型別佔4位元組,char占用1位元組,...