#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
wyrównanie, a
, odlewa się do typu x
„s, a następnie odejmuje się jeden. Wyrównanie powinno być potęgą 2, tak aby uzyskać pewną liczbę wzorca bitowego 00..011..11
typu x
, czyli maski (k
1s, jeśli a = 2^k
).
Następnie
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
dodaje wartość maska x
tak, (x)+ (mask)
jest co najmniej tak duża jak najmniejszą wielokrotnością dostosowania, który jest nie mniejszy niż x
i mniejszy niż kolejnego wielokrotności. Następnie bitowe i uzupełniające maskę zmniejsza tę liczbę do tej wielokrotności wyrównania.
Dla masek postaci 2^k - 1
, obliczanie
(x + mask) & ~mask
jest taka sama jak
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
lub
((x + 2^k - 1)/(2^k)) * (2^k)
Będzie to działać trick 'alignment' które nie są moc 2. –
Nie, działa tylko dla potęgi 2. Jednak wyrównywanie jest użyteczne tylko dla potęg 2, więc żadne użyteczne przypadki nie są niewłaściwe. –