日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C/C++】字节对齐 ALIGN宏

發(fā)布時間:2023/12/20 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++】字节对齐 ALIGN宏 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何實現(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

值二進(jìn)制
a0000 0001 0000
x0000 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。