motores - norma iso para alineacion de ejes
ComprobaciĆ³n de alineaciĆ³n de la memoria (3)
Quiero comprobar si una memoria asignada está alineada o no. Estoy usando _aligned_malloc(size, align);
Y devuelve un puntero. ¿Puedo verificarlo simplemente dividiendo el contenido del puntero por 16, por ejemplo? Si el contenido del puntero es divisible por 16, ¿significa que la memoria está alineada por 16 bytes?
En un sistema Unix moderno, lo más probable es que un puntero devuelto por malloc
esté alineado con 16 bytes, ya que esto es necesario para cosas como SSE. Para verificar la alineación de una potencia de 2 puedes usar:
((unsigned long)p & (ALIGN - 1)) == 0
Esto es simplemente una versión más rápida de (p % ALIGN) == 0
. (Si ALIGN
es una constante, su compilador probablemente usará automáticamente la versión más rápida de arriba).
La memoria devuelta por malloc está alineada para todo (es decir, generalmente utiliza una alineación que funciona para todo) *. Eso significa que, si tienes un problema de alineación, es otra cosa.
http://www.delorie.com/gnu/docs/glibc/libc_31.html
http://msdn.microsoft.com/en-us/library/ms859665.aspx
(Parece que hay excepciones para órdenes de alineación más altas, lo cual es un requisito inusual de todos modos).
Un puntero "alineado" por definición significa que el valor numérico del puntero es divisible de manera uniforme por N (donde N es la alineación deseada). Para verificar esto, convierta el puntero en un número entero de tamaño adecuado, tome el módulo N y verifique si el resultado es cero. En codigo:
bool is_aligned(void *p, int N)
{
return (int)p % N == 0;
}
Si desea verificar el valor del puntero a mano, solo mire la representación hexadecimal del puntero y vea si termina con el número requerido de 0 bits. Un valor de puntero alineado de 16 bytes siempre terminará en cuatro bits cero, por ejemplo.