【C/C++】字节对齐 ALIGN宏
如何實現(xiàn)
先看一下代碼中隨處可見的字節(jié)對齊宏定義:
#define BYTE_ALIGN(x,a) ( ((x) + ((a) - 1) ) & ( ~((a) - 1) ) )字節(jié)對齊實現(xiàn)了什么功能呢?
其實就是計算不小x的、a的最小公倍數(shù)。
經(jīng)過實驗,我發(fā)現(xiàn),a要為2的n次方,才會實現(xiàn)上面說的對齊功能,如果a不止2的n次方,BYTE_ALIGN(x,a)后的值還是x。
實驗驗證
#include <iostream> #include <cstdio>using namespace std;#define BYTE_ALIGN(x,a) ( ((x) + ((a) - 1) ) & ( ~((a) - 1) ) )int main() {int a = 15;int x = 39;for (int i = 0; i < 4; i++) {cout << "------ a = " << a + i << " ------ " << endl;for (int j = 0; j < 4; j++) {printf("x = %d, a = %d, BYTE_ALIGN(x,a) = %d\n",\x + j, a + i, BYTE_ALIGN(x + j, a + i));}cout << endl;} }/* 輸出結(jié)果: ------ a = 15 ------ x = 39, a = 15, BYTE_ALIGN(x,a) = 49 x = 40, a = 15, BYTE_ALIGN(x,a) = 48 x = 41, a = 15, BYTE_ALIGN(x,a) = 49 x = 42, a = 15, BYTE_ALIGN(x,a) = 48------ a = 16 ------ x = 39, a = 16, BYTE_ALIGN(x,a) = 48 x = 40, a = 16, BYTE_ALIGN(x,a) = 48 x = 41, a = 16, BYTE_ALIGN(x,a) = 48 x = 42, a = 16, BYTE_ALIGN(x,a) = 48------ a = 17 ------ x = 39, a = 17, BYTE_ALIGN(x,a) = 39 x = 40, a = 17, BYTE_ALIGN(x,a) = 40 x = 41, a = 17, BYTE_ALIGN(x,a) = 41 x = 42, a = 17, BYTE_ALIGN(x,a) = 42------ a = 18 ------ x = 39, a = 18, BYTE_ALIGN(x,a) = 40 x = 40, a = 18, BYTE_ALIGN(x,a) = 40 x = 41, a = 18, BYTE_ALIGN(x,a) = 42 x = 42, a = 18, BYTE_ALIGN(x,a) = 42 */可以看到只有當(dāng)a = 16是BYTE_ALIGN對齊結(jié)果都是16的倍數(shù)48。a為其他值時實現(xiàn)不了所謂的對齊。
我們把a改為32看一下:
/* ------ a = 31 ------ x = 39, a = 31, BYTE_ALIGN(x,a) = 65 x = 40, a = 31, BYTE_ALIGN(x,a) = 64 x = 41, a = 31, BYTE_ALIGN(x,a) = 65 x = 42, a = 31, BYTE_ALIGN(x,a) = 64------ a = 32 ------ x = 39, a = 32, BYTE_ALIGN(x,a) = 64 x = 40, a = 32, BYTE_ALIGN(x,a) = 64 x = 41, a = 32, BYTE_ALIGN(x,a) = 64 x = 42, a = 32, BYTE_ALIGN(x,a) = 64------ a = 33 ------ x = 39, a = 33, BYTE_ALIGN(x,a) = 71 x = 40, a = 33, BYTE_ALIGN(x,a) = 72 x = 41, a = 33, BYTE_ALIGN(x,a) = 73 x = 42, a = 33, BYTE_ALIGN(x,a) = 74 */a = 32確實實現(xiàn)了對齊到32的整數(shù)倍64。a = 31或a = 33算出的結(jié)果都是亂的,不知道干了個啥邏輯。
為什么a為2n才可以?
用二進(jìn)制手動演算一下:
若a = 16, x = 40
| a | 0000 0001 0000 |
| x | 0000 0010 1000 |
| ~((a) - 1) ) | 1111 1111 0000 |
| ((x) + ((a) - 1) | 0000 0011 0111 |
| BYTE_ALIGN(x,a) | 0000 0011 0000 |
~((a) - 1) ) 用低位取0,就是為了能與到比a大的結(jié)果。
((x) + ((a) - 1)就是為了增加x的值,之后與運算可以得到更大的結(jié)果。
應(yīng)用場景
經(jīng)常在圖片處理的時候做字節(jié)對齊,將圖像的寬和高對齊為64或512的整數(shù)倍。
向下對齊
瀏覽別人的博客,發(fā)現(xiàn)上面說的只是向上對齊,還有向下對齊。
#define alignment_down(a, size) (a & (~(size-1)) )#define alignment_up(a, size) ((a+size-1) & (~ (size-1)))a=0, size=8, 則alignment_down(a,size)=0, alignment_up(a,size)=0.
a=6, size=8, 則alignment_down(a,size)=0, alignment_up(a,size)=8.
a=8, size=8, 則alignment_down(a,size)=8, alignment_up(a,size)=8.
a=14, size=8,則alignment_down(a,size)=8, alignment_up(a,size)=16.
注:size應(yīng)當(dāng)為2的n次方, 即2, 4, 8, 16, 32, 64, 128, 256, 1024, 2048, 4096 …
總結(jié)
以上是生活随笔為你收集整理的【C/C++】字节对齐 ALIGN宏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四通利方的那些人
- 下一篇: s3c2440移植MQTT