內存對齊宏ALIGN的理解
在Android Camera HAL代碼中經常看到ALIGN這個宏,主要用來進行內存對齊,下面是v4l2_wrapper.cpp中ALIGN的一些定義
//v4l2_wrapper.cpp中內存分配進行對其的操作和定義#define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1)))
#define ALIGN8K 8192
#define ALIGN4K 4096
#define ALIGN2K 2048
#define ALIGN512 512
#define ALIGN256 256
#define ALIGN128 128
#define ALIGN64 64
#define ALIGN32 32
#define ALIGN16 16
下面對一些定義進行解釋:
#define ALIGN(size, align) ((size + align - 1) & (~(align - 1)))
就是定義一個常量函數常量ALIGN
ALIGN包含兩個變量size, align后面的是對這兩個變量的范圍規定。
在函數中,出現 ALIGN的地方,用后面的((size + align - 1) & (~(align - 1)))代替!
#define ALIGN(x,a) (((x)+(a)-1)&~(a-1))
就是以a為上界對其的意思。舉個例子4k頁面邊界的例子,即:
a=4096,
x = 3888, 那么以上界對齊為4096。
x = 4096, 結果為4096.
x = 4222, 結果為8192.
另外還有一種以下界對齊的方式 #define ALIGN(x,a) ((x)&~(a-1))
a=4096,
x = 3888,結果為0.
x = 4095,結果為0
x = 4096,結果為4096
x = 4222,結果為4096.
#define ALIGN(size, align) ((align == 0) ? size: ((size + align - 1) & (~(align - 1))))
//后面的與,其實是把二進制的低x位置0,因為,按照align對齊,總能被align整除
這個宏表示的意思是:
現在要分配一個內存空間,從0地址開始,size為需要占據的字節大小,按照align個字節對齊,則結束地址應該為多少。
舉個例子:
ALIGN(15, 4),就應該等于16,我們計算一下,會發現確實等于16
參考文章:
MySQL中的ALIGN_SIZE宏解釋_alignsize