|
|
Обычно,
когда переменная с числовым типом данных
создана, компилятор будет гарантировать,
что переменная сохранена в должным образом
выровненном адресе, но когда числовые
данные сохранены в динамически выделенном
буфере, программист
должен делать предосторожности, чтобы
гарантировать, что память
должным образом выровнена. Некоторые
платформы, в особенности с процессорами RISC,
требуют, чтобы числовые данные в
динамически выделенных структурах памяти
были выровнены должным образом в памяти.
Выравнивание зависимо, и от типа данных
и от платформы. Например, short
число на Sun
SPARCstation должно
быть расположено в адресе, делимом 2, в то
время как long
на той же самой платформе должен быть
расположен в адресе, делимом 4. В
большинстве случаев, элемент данных
должным образом выровнен, если адрес его
стартового байта делимый правильным
номером выравнивания. Консультируйтесь с
определенной системой и документацией
компилятора для требований выравнивания.
Полезное правило бегунка - то, что размер
типа данных является всегда имеющим силу
номером выравнивания для типа данных. Для
данного типа T, если размер (T) равняется n, то
адреса делимый n правильно выровнены для T.
Следующее макро выражение может
использоваться, чтобы выровнять данные: #define
ALIGN (ptr, n) ((ptr + n - 1) и
~ (n - 1)))) Где
ptr - указатель на символ. Следующий
код иллюстрирует, как макрокоманда ALIGN
могла бы
использоваться: char
*buffer_pointer, *next_aligned; next_aligned
= ALIGN(buffer_pointer, sizeof(T));
|
Дизайн: Piton Alien |