Estoy haciendo una rutina de copia en bloque de memoria y necesito tratar con bloques de memoria sin procesar en trozos eficientes. Mi pregunta no es sobre la rutina de copia especializada que estoy haciendo, sino cómo examinar correctamente la alineación del puntero sin procesar en C.Sintaxis aprobada para la manipulación del puntero sin formato
Tengo un puntero de memoria sin procesar, digamos que ya está emitido como un carácter no nulo * . En mi arquitectura, puedo copiar de manera muy eficiente la memoria en trozos de 64 bytes CUANDO ESTÁ ALINEADA EN UN COMPONENTE DE 64 BYTE. Entonces, el truco (estándar) es que haré una copia simple de 0-63 bytes "manualmente" en la cabeza y/o la cola para transformar la copia de un carácter arbitrario * de longitud arbitraria a un puntero alineado de 64 bytes con algunos valores múltiples de 64 bytes de longitud.
Ahora la pregunta es, ¿cómo legalmente "examinar" un puntero para determinar (y manipular) su alineación? La forma más obvia es para su emisión en un entero y simplemente examinar los bits:
char *pointer=something.
int p=(int)pointer;
char *alignedPointer=(char *)((p+63)&~63);
Obsérvese en este punto me di cuenta que alignedPointer no apunta a la misma memoria que el puntero ... este es el "redondea" puntero al que puedo llamar mi rutina de copia eficiente, y manejaré cualquier otro byte al comienzo manualmente.
Pero los compiladores (justificadamente) se vuelven locos al convertir un puntero en un número entero. Pero, ¿de qué otra manera puedo examinar y manipular los bits inferiores del puntero en LEGAL C? Lo ideal sería que con diferentes compiladores no obtuviera errores ni advertencias.
Eso debería estar bien siempre que 'int' tenga el mismo tamaño que los tipos de puntero. –
También es posible que desee echar un vistazo a http://stackoverflow.com/questions/1898153/how-to-determine-if-memory-is-aligned-testing-for-alignment-not-aligning/1898194 –
Ah, pero presupone que los punteros se almacenan en binario de MSB a LSB. ¿Que tenemos? * comportamiento indefinido! * (dicho de la misma manera que el tipo de arma letal dice * ¡inmunidad diplomática! *) El hecho de que funcione en el mundo real no lo hace menos indefinido. ;-) –