Estoy trabajando en un grupo de memoria para un motor de juegos pequeños.¿Qué considerar con respecto a la alineación cuando se diseña un grupo de memoria?
El uso principal será como un almacenamiento segregado; un grupo contiene un objeto de un tipo y tamaño específico. Actualmente, las agrupaciones se pueden usar para almacenar cualquier cosa, pero las asignaciones se realizarán en bloques de un tamaño específico. La mayor parte de la necesidad de memoria se asignará a la vez, pero se puede habilitar el "crecimiento excesivo" si es necesario para ayudar en la sintonización (tamaño casi fijo).
El problema es que comencé a sentirme un tanto paranoico al contemplar la alineación de la memoria. Solo estoy acostumbrado a la administración de memoria sin procesar en procesadores de 8 bits donde todo está alineado por bytes.
Voy a dejar que el usuario (me) especifique el tamaño deseado de los bloques, que en el caso de almacenamiento segregados sería el tamaño de los objetos que voy a almacenar en él.
El enfoque actual es asignar un trozo de memoria blocks * (desired_size + header_size)
grande y colocar los objetos en él, con un encabezado para cada bloque; Obviamente, los objetos se ubicarían directamente detrás de este encabezado.
¿Qué debo tener en cuenta con respecto a la alineación de memoria en mi escenario?
La respuesta que he encontrado hasta el momento es que el tiempo que representa desired_size
n -byte datos alineados; el encabezado está correctamente alineado y empaquetado por el compilador, así como los datos reales, todo lo almacenado en el bloque será n -byte alineado.
n es cualquier límite requerido por la plataforma. Me estoy orientando a x86 por el momento, pero no me gusta hacer ninguna suposición sobre la plataforma en mi código.
Algunos de los recursos que he utilizado:
- http://www.ibm.com/developerworks/library/pa-dalign/
- http://en.wikipedia.org/wiki/Data_structure_alignment
- Memory alignment on a 32-bit Intel processor
- docs Boost piscina en busca de inspiración en el diseño general. Me gustaría evitar arrastrar impulso en este proyecto; y estoy viendo esto como una oportunidad de aprendizaje también.
Editar
Subido código de ejemplo pequeña que puede nadie útiles tan confundido como mí en el futuro here.
También podría agregar que lo mismo es cierto con todas las funciones de asignación (así '' operator new' and kin.) – GManNickG
Gracias por la respuesta. ¿Cómo se determina el máximo? alineación de un tipo? Si entendí correctamente tu segundo párrafo, supongamos x86 aquí por simplicidad, esto significa que si el encabezado tiene 4 bytes, estará alineado a 4 bytes, y los datos serán de 8 bytes, estarán alineados a 8 bytes. Esto significa que necesito rellenar el encabezado con 4 bytes para que los datos estén alineados correctamente, ¿correcto? – Skurmedel
He estado pensando en su propuesta "lo suficientemente buena", suena pragmático; Me gusta pragmático. ¿Cómo sabría qué es lo suficientemente bueno? ¿Esto solo se aseguraría de que el encabezado esté alineado al máximo? alineación de la plataforma o sería dependiente del tamaño real de los datos almacenados (por lo que es menos deseable)? – Skurmedel