2010-10-01 18 views
31

¿Hay alguna función estandarizada en GCC o glibc para asignar bloque de memoria en el puntero alineado? Me gusta _align_malloc() en MSVC?alineado malloc() en GCC?

+0

stdlib única versión http://stackoverflow.com/questions/227897/how-to-allocate-aligned-memory-only-using- the-standard-library –

Respuesta

4

Depende del tipo de alineación que espere. ¿Desea una alineación más estricta o una alineación más relajada?

malloc por definición, se garantiza que devolverá un puntero que esté alineado correctamente para almacenar cualquier tipo estándar en el programa C (y, por lo tanto, cualquier tipo construido a partir de tipos estándar). ¿Es lo que estás buscando? ¿O necesitas algo diferente?

+15

Una p común El problema es que los tipos SIMD (como los vectores SSE) no se consideran "tipos estándar", por lo que tienen requisitos de alineación más estrictos que los que proporciona 'malloc'. – jalf

+0

Otra razón para querer hacer esto es el rendimiento.Al alinear una estructura de datos para que abarque 'n' en lugar de' n + 1' L1 líneas de caché que normalmente tienen un tamaño de 4096 bytes, obtendrá un acceso de memoria más rápido en promedio. Para ciertas aplicaciones, digamos procesamiento de audio, donde los buffers son del tamaño de una línea de caché L1, o un pequeño múltiplo de ese tamaño, esto puede marcar una gran diferencia. – nitro2k01

+2

@ nitro2k01: las líneas de caché son mucho más pequeñas, p. 32 en x86 y 64 en amd64. Las páginas OTOH son 4k. – diapir

19

El [1] función [posix_memalign()] proporciona alineado asignación de memoria y ha estado disponible desde glibc 2.1.91.

pero no necesariamente con otros compiladores: citando el estándar "El posix_memalign() es parte de la opción de información de asesoramiento y no tiene por qué ser proporcionada en todas las implementaciones"

24

Desde que se hizo la pregunta, una nueva función se ha normalizado por C11:

void *aligned_alloc(size_t alignment, size_t size); 

y está disponible en glibc (no en las ventanas por lo que yo sé). Toma sus argumentos en el mismo orden que memalign, el reverso de _aligned_malloc de Microsoft, y usa la misma función free que para la desasignación.

7

Hay _mm_malloc y _mm_free que están soportados por la mayoría de los compiladores del mundo x86/x64, con al menos:

  • gcc
  • MinGW (gcc Win32/Win64)
  • MSVC
  • tañido
  • CPI

Un FAIK, estas funciones no son un estándar en absoluto. Pero según mi conocimiento, los más apoyados. Otras funciones son más compilador específico:

  • _aligned_malloc es MSVC y MinGW única
  • funciones memalign
  • POSIX no son compatibles con al menos MSVC

También hay funciones estándar C11, pero por desgracia no están en C++ 11, e incluirlos en C++ requiere preprocesador no estándar define ...