Проверка выравнивания памяти - PullRequest
16 голосов
/ 05 июня 2011

Я хочу проверить, выравнивается ли выделенная память или нет. Я использую _aligned_malloc(size, align); И он возвращает указатель. Могу ли я проверить это, например, просто разделив содержимое указателя на 16? Если содержимое указателя делится на 16, означает ли это, что память выровнена на 16 байтов?

Ответы [ 3 ]

22 голосов
/ 05 июня 2011

«Выровненный» указатель по определению означает, что числовое значение указателя делится равномерно на N (где N - желаемое выравнивание). Чтобы проверить это, приведите указатель к целому числу подходящего размера, возьмите модуль N и проверьте, равен ли результат нулю. В коде:

bool is_aligned(void *p, int N)
{
    return (int)p % N == 0;
}

Если вы хотите проверить значение указателя вручную, просто посмотрите на шестнадцатеричное представление указателя и посмотрите, заканчивается ли оно требуемым числом 0 битов. Выровненное по 16 байтов значение указателя всегда заканчивается, например, четырьмя нулевыми битами.

8 голосов
/ 05 июня 2011

В современной системе Unix указатель, возвращаемый malloc, скорее всего выровнен на 16 байт, поскольку это требуется для таких вещей, как SSE.Чтобы проверить выравнивание степени 2, вы можете использовать:

((unsigned long)p & (ALIGN - 1)) == 0

Это просто более быстрая версия (p % ALIGN) == 0.(Если ALIGN является константой, ваш компилятор, вероятно, автоматически использует более высокую версию выше.)

0 голосов
/ 06 июня 2011

Память, возвращаемая malloc, выравнивается для всего (т. Е. Обычно используется выравнивание, которое работает для всего) *. Это означает, что если у вас есть проблема с выравниванием, это что-то еще.

http://www.delorie.com/gnu/docs/glibc/libc_31.html

http://msdn.microsoft.com/en-us/library/ms859665.aspx

(Кажется, есть исключения для более высоких порядков выравнивания, что в любом случае является необычным требованием.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...