このマクロの機能を理解できません。これらはlinux-kernel
で定義されていますが、疑いの余地はそれとは無関係です。 (((x)+(mask))&~(mask))
行が何をするのか分かりません。マクロカーネルを整列する
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
助けてください。
このマクロの機能を理解できません。これらはlinux-kernel
で定義されていますが、疑いの余地はそれとは無関係です。 (((x)+(mask))&~(mask))
行が何をするのか分かりません。マクロカーネルを整列する
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
助けてください。
と同じであるあなたは数を持っていると言う:0x1006
いくつかの理由から、それを4
バイト境界に揃えたいとします。 4バイト境界で
は、あなたが知っている整列値はあなたが、その後も0x1006
の整列値が0x1008
知っている など0x1000
、0x1004
、0x1008
、です。
あなたはどうすれば0x1008
を取得しますか?アライメント値4
ためのアライメントマスクは(4 - 1) = 0x03
今0x1006 + 0x03 = 0x1009
と0x1009 & ~0x03 = 0x1008
この操作は、マクロ__ALIGN_MASK
あります。
あなたの代わりに直接0x03
(アライメントマスク)の値4
(アライメント)を渡したい場合は、
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
アラインメント、a
、x
の型にキャストし、その後一方が減算されます。アライメントは2の累乗でなければならないので、ビットパターン00..011..11
の数字がx
のタイプであるマスク(k
1sがa = 2^k
の場合)が結果として得られます。 (x)+ (mask)
が次に大きい倍数よりx
より小さく、小さくないアラインメントの最小複数と少なくとも同じ大きさであるように
そして
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
は、x
にマスクの値を加算します。次に、マスクのビット単位および補数は、その数をそのアライメントの倍数に減らします。フォーム2^k - 1
のマスクに
、計算
(x + mask) & ~mask
は
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
または
((x + 2^k - 1)/(2^k)) * (2^k)
マクロ
ALIGN
は2 –のパワー 'alignment'のためにこのトリックの仕事をされないだろうていますいいえ、それは2の累乗に対してのみ機能します。しかし、アライメントの指定は2の累乗にのみ有効です。したがって、有用なケースは誤って処理されません。 –