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

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.

  • ¿Por qué debería descartar AlertDialog manualmente en Android?
  • guardar una cadena en la memoria interna y luego mostrarla
  • Android - view.Surface OutOfResourcesException
  • Límite de tamaño de Android montón, todavía tenemos necesidad de diseñar aplicaciones con un límite de 16 MB en mente?
  • ¿Cómo liberar la memoria del objeto Activity real después de dejar la actividad?
  • Beneficios de GSON sobre el análisis normal de JSON
  • ¿Cómo almacenar en caché y almacenar objetos y establecer una política de expiración en android?
  • Inicializaciones repetidas de actividad y uso de memoria
  • Referencia débil en lugar de getActivity () (evitar Android memoria fugas)?
  • Manejo de fugas de memoria Xamarin.Forms
  • Cómo evitar la pérdida de memoria en context.getSystemService (Context.CAMERA_SERVICE)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.