(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...