recursivity program passing c memory-management

program - passing arguments in c



¿Qué se entiende por "la memoria está alineada con 8 bytes"? (4)

Al pasar por un proyecto, he visto que los datos de la memoria están "alineados a 8 bytes". ¿Alguien puede explicar qué significa esto?


"X bytes alineados" significa que la dirección base de sus datos debe ser un múltiplo de X. Se puede usar para usar un hardware especial como un DMA en un hardware especial, para un acceso más rápido por parte de la CPU, etc.

Es el caso del procesador de celdas en el que los datos deben estar alineados a 16 bytes para copiarse desde / hacia el coprocesador.


La alineación de la memoria es importante para el rendimiento de diferentes maneras. Tiene una razón relacionada con el hardware. Desde los años 80 hay una diferencia en el tiempo de acceso entre la CPU y la memoria. La velocidad del procesador está creciendo más rápido que la velocidad de la memoria. Esta diferencia es cada vez más grande con el tiempo (para dar un ejemplo: en la Apple II, la CPU estaba a 1.023 MHz, la memoria tenía el doble de esa frecuencia, 1 ciclo para la CPU, 1 ciclo para el video. Una PC moderna funciona a aproximadamente 3GHz en la CPU, con una memoria a apenas 400MHz). Una solución al problema de reducir la velocidad de la memoria, es acceder a ella en buses cada vez más amplios, en lugar de acceder a 1 byte a la vez, la CPU leerá una palabra de 64 bits de ancho de la memoria. Esto significa que incluso si lee 1 byte de la memoria, el bus entregará un total de 64 bits (palabra de 8 bytes). La memoria tendrá estas unidades de 8 bytes en las direcciones 0, 8, 16, 24, 32, 40, etc. Un múltiplo de 8. Si accede, por ejemplo, una palabra de 8 bytes en la dirección 4, el hardware tendrá que leer la palabra en la dirección 0, enmascara los 4 bytes altos de esa palabra, luego lee la palabra en la dirección 8, enmascara la parte baja de esa palabra, combínala con la primera mitad y dásela al registro. Como se puede ver una operación bastante complicada (por lo tanto lenta). Esta es la primera razón por la que a uno le gusta el acceso a la memoria alineada. Daré otra razón en 2 horas.


Un objeto que está "8 bytes alineados" se almacena en una dirección de memoria que es un múltiplo de 8.

Muchas CPU solo cargarán algunos tipos de datos desde ubicaciones alineadas; en otras CPU tal acceso es más rápido. También hay varias otras razones posibles para usar la alineación de la memoria, sin ver el código es difícil decir por qué.

El acceso alineado es más rápido porque el bus externo a la memoria no tiene un ancho de un solo byte, generalmente tiene un ancho de 4 u 8 bytes (o incluso más ancho). Esto significa que la CPU no recupera un solo byte a la vez; obtiene 4 u 8 bytes comenzando en la dirección solicitada. Como consecuencia de esto, la CPU no envía realmente los 2 o 3 bits menos significativos de la dirección de memoria; la memoria externa solo se puede leer o escribir en direcciones que son un múltiplo del ancho del bus. Si solicitó un byte en la dirección "9", la CPU realmente le pedirá a la memoria el bloque de bytes que comienza en la dirección 8, y cargará el segundo en su registro (descartando los demás).

Esto implica que un acceso mal alineado puede requerir dos lecturas de la memoria: si solicita 8 bytes que comienzan en la dirección 9, la CPU debe obtener los 8 bytes que comienzan en la dirección 8 y los 8 bytes que comienzan en la dirección 16, luego enmascarar la bytes que querías Por otro lado, si solicita los 8 bytes que comienzan en la dirección 8, entonces solo se necesita una búsqueda. Algunas CPU ni siquiera realizarán una carga tan desalineada; simplemente generarán una excepción (¡o incluso cargarán los datos incorrectos!).


Si los datos de la memoria están alineados con 8 bytes, significa:
sizeof(the_data) % 8 == 0 .
En general, en lenguaje C, si se propone que una estructura esté alineada con 8 bytes, su tamaño debe ser una multiplicación de 8, y si no lo está, se requiere relleno manualmente o por compilador. algunos compiladores proporcionan directivas para hacer una estructura alineada con n bytes, para VC, es #prgama pack(8) , y para gcc, es __attribute__((aligned(8))) .