tipos para norma motores maquinaria laser equipos ejes bombas alineamiento alineacion c visual-studio

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).



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.