記憶體對齊演算法

2021-08-03 06:18:17 字數 893 閱讀 3981

(1)最容易想到的演算法:

[cpp]view plain

copy

unsigned int calc_align(unsigned int n,unsigned align)    

(2)更好的演算法:

[cpp]view plain

copy

unsigned int calc_align(unsigned int n,unsigned align)    

對於2演算法原理如下:

2位元組對齊,要求位址位為2,4,6,8...,要求二進位制位最後一位為0(2的1次方)

4位元組對齊,要求位址位為4,8,12,16...,要求二進位制位最後兩位為0(2的2次方)

8位元組對齊,要求位址位為8,16,24,32...,要求二進位制位最後三位為0(2的3次方)

16位元組對齊,要求位址位為16,32,48,64...,要求二進位制位最後四位為0(2的4次方)

...由此可見,我們只要對資料補齊對齊所需最少資料,然後將補齊位置0就可以實現對齊計算。

(1)(align-1),表示對齊所需的對齊位,如:2位元組對齊為1,4位元組為11,8位元組為111,16位元組為1111...

(2)(x+(align-1)),表示x補齊對齊所需資料      

(3)&~(align-1),表示去除由於補齊造成的多餘資料

(4) (x+(align-1))&~(align-1),表示對齊後的資料

舉個例子:如8位元組對齊。起始地始是6

6 + (8 - 1)=0000 0110 + 0000 0111 = 0000 1101

0000 1101 & ~(0000 0111) = 0000 1000  //去除由於補齊造成的多餘資料

記憶體對齊演算法

32bit,x86環境,vs2010 struct test char m1 unsigned int m2 char m3 double m4 char m5 對其執行sizeof test 得到值為32,並且我們對裡面每個變數取sizeof,確實是所屬型別的大小,但為什麼不是1 4 1 8 1 ...

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...