Alineación de la memoria en iPhone y Android
Como he descubierto de mis pruebas malloc del iPhone tiene alineación de 16 bytes. Pero no estoy seguro si es garantizado o simplemente coincidencia.
Así que la pregunta es: ¿cuál es la alineación garantizada de la memoria cuando se utiliza malloc () en iOS y Android (NDK)?
- Análisis de memoria en Android: dominator_tree no muestra todas las instancias de algunos objetos
- ¿Hay una manera de recortar una imagen grande en android sin cargar en la memoria?
- Tamaño del montón de Android VM
- OutOfMemoryError al cargar actividades
- FragmentStatePagerAdapter OutOfMemoryError
- Fragmentos retenidos con IU y fugas de memoria
- ¿Trabajar alrededor de la fuga de SpellCheckerSession?
- Android OutOfMemory pero con memoria de sobra
- Android java.lang.OutOfMemoryError?
- ¿Qué significa si totalMemory es pequeño, pero totalPss es muy grande?
- Obtenga memoria de proceso libre en android
- Android contrapartida de la advertencia de memoria iOS
- Prueba Android "destruir actividad para ahorrar espacio"
Malloc en C devuelve un puntero a un bloque de memoria "que está adecuadamente alineado para cualquier tipo de variable"; Si esta alineación es o permanecerá en 16 bytes no está garantizada incluso para diferentes versiones del mismo sistema operativo. Objetivo-C se basa efectivamente en C, por lo que debería ser cierto también.
Si su Android NDK está escrito en C o C ++, lo mismo debería ser cierto allí.
En iOS, la alineación es actualmente de 16 bytes, como has descubierto. Sin embargo, eso no está garantizado ni documentado. Es decir, no confíe en ello.
Suponiendo que esté disponible en iOS, posix_memalign()
permite la asignación de memoria específicamente alineada. Puede haber otros mecanismos.
Android no es mi bailiwick.
Estoy de acuerdo en que todavía no debe confiar en esto, pero para algo así como una función de hash es bastante útil.
En realidad está documentado – https://developer.apple.com/library/ios/#documentation/performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html
Extracto:
Asignación de pequeños bloques de memoria con Malloc
Para pequeñas asignaciones de memoria, donde small es algo menos que unas cuantas páginas de memoria virtual, malloc sub-asigna la cantidad de memoria solicitada de una lista (o "pool") de bloques libres de tamaño creciente. Cualquier pequeño bloque que desalocar usando la rutina libre se agrega de nuevo a la piscina y se reutiliza en una base de "mejor ajuste". El grupo de memoria en sí mismo está compuesto de varias páginas de memoria virtual que se asignan mediante la rutina vm_allocate y administradas por el sistema.
Al asignar pequeños bloques de memoria, recuerde que la granularidad de los bloques asignados por la biblioteca malloc es de 16 bytes . Por lo tanto, el bloque más pequeño de memoria que puede asignar es 16 bytes y cualquier bloque mayor que eso es un múltiplo de 16. Por ejemplo, si llama a malloc y pide 4 bytes, devuelve un bloque cuyo tamaño es 16 bytes; Si solicita 24 bytes, devuelve un bloque cuyo tamaño es 32 bytes. Debido a esta granularidad, debe diseñar sus estructuras de datos con cuidado y tratar de hacer múltiplos de 16 bytes siempre que sea posible.
- No se especifica ninguna orientación y el valor predeterminado es horizontal. Esta es una fuente común de errores cuando los niños se añaden dinámicamente
- Proguard error: Esperando la clase seperator de ruta – no estoy seguro donde necesito poner un camino entre comillas