2012-10-04 14 views
6

Mam wartość, którą chcę wyrównać do danego wyrównania, tj. Zwiększ wartość do następnej wielokrotności wyrównania, jeśli nie jest jeszcze wyrównana.Sposób wyrównania wartości do określonego wyrównania

Jaki jest zwięzły sposób to zrobić w C++?

np

int x; 
int alignment; 
int y = ???; // align x to alignment 
+2

C++ 11 ma 'alignas' , jeśli możesz tego użyć. – chris

+0

Dla jasności: mówisz o * wyrównaniu pamięci *, więc * nie * chcesz "zwiększyć wartość" - chcesz wyrównać adres pamięci obiektu; czy to prawda? –

+0

int y = x + (wyrównanie x% == 0? 0: wyrównanie - wyrównanie x%) –

Odpowiedz

8

Umożliwia znaczy ustawienie jest a

---(k-1)a-----------x--------------ka--------- 
     <----r----><-----(a-r)---> 

gdzie k jest liczbą całkowitą (czyli ka jest wielokrotnością pokrywać)

pierwsze znaleźć pozostałą

r = x%a

następnie zwiększyć X do następnego wielokrotności

y = x + (a-r)

Ale jeśli r = 0, y = x

więc ostatecznie

r = x%a; 
y = r? x + (a - r) : x; 
+1

Chcesz tylko inkrementować, jeśli pozostało "r". więc jest to "y = r? x + (a-r): x ' – ScaryAardvark

+0

Ya. Zmieniono moją odpowiedź. Dziękuję Ci. – Shashwat

+0

Dzięki, że działa idealnie. – ljbade

Powiązane problemy