una tiene saber plastico legal garantia estetica donde denuncias denunciar como clinica cirujano cirugia c++ performance alignment new-operator

c++ - tiene - donde denunciar a un cirujano plastico



¿Hay alguna garantía de alineación del retorno de la dirección mediante la nueva operación de C++? (5)

A propósito, la documentación de MS menciona algo sobre malloc / nuevas direcciones de retorno que están alineadas en 16 bytes, pero a partir de la experimentación, este no es el caso. Sucedí que necesitaba la alineación de 16 bytes para un proyecto (para acelerar las copias de memoria con un conjunto de instrucciones mejorado), al final recurrí a escribir mi propio asignador ...

La mayoría de los programadores experimentados saben que la alineación de datos es importante para el rendimiento del programa. He visto que algunos programadores escribieron un programa que asigna un tamaño de memoria más grande de lo que necesitan, y usan el puntero alineado como comenzar. Me pregunto si debería hacer eso en mi programa, no tengo idea de si hay alguna garantía de alineación de la dirección devuelta por la nueva operación de C ++. Así que escribí un pequeño programa para probar

for(size_t i = 0; i < 100; ++i) { char *p = new char[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } for(size_t i = 0; i < 100; ++i) { short *p = new short[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } for(size_t i = 0; i < 100; ++i) { float *p = new float[123]; if(reinterpret_cast<size_t>(p) % 4) { cout << "*"; system("pause"); } cout << reinterpret_cast<void *>(p) << endl; } system("pause");

El compilador que estoy usando es Visual C ++ Express 2008. Parece que todas las direcciones de la nueva operación devuelta están alineadas. Pero no estoy seguro. Entonces mi pregunta es: ¿hay alguna garantía? Si tienen garantía, no tengo que alinearme, si no, tengo que hacerlo.


El operador nuevo / nuevo [] de la plataforma devolverá los punteros con la alineación suficiente para que funcione bien con los tipos de datos básicos (doble, flotante, etc.). Al menos cualquier compilador razonable de C ++ + tiempo de ejecución debería hacer eso.

Si tiene requisitos de alineación especiales como SSE, entonces es probable que sea una buena idea usar funciones especiales alignment_malloc o enrollar las suyas propias.


Esta es una respuesta tardía, pero solo para aclarar la situación en Linux: en los sistemas de 64 bits, la memoria siempre está alineada en 16 bytes:

http://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html

La dirección de un bloque devuelto por malloc o realloc en el sistema GNU siempre es un múltiplo de ocho (o dieciséis en sistemas de 64 bits).

El new operador llama internamente a malloc (ver ./gcc/libstdc++-v3/libsupc++/new_op.cc ) así que esto también se aplica a los new .

La implementación de malloc que es parte de glibc básicamente define MALLOC_ALIGNMENT como 2*sizeof(size_t) y size_t es 32bit = 4byte y 64bit = 8byte en un sistema x86-32 y x86-64, respectivamente.

$ cat ./glibc-2.14/malloc/malloc.c: ... #ifndef INTERNAL_SIZE_T #define INTERNAL_SIZE_T size_t #endif ... #define SIZE_SZ (sizeof(INTERNAL_SIZE_T)) ... #ifndef MALLOC_ALIGNMENT #define MALLOC_ALIGNMENT (2 * SIZE_SZ) #endif


La alineación tiene la siguiente garantía del estándar (3.7.3.1/2):

El puntero devuelto se alineará adecuadamente para que se pueda convertir en un puntero de cualquier tipo de objeto completo y luego se use para acceder al objeto o matriz en el almacenamiento asignado (hasta que el almacenamiento sea explícitamente desasignado por una llamada a la función de desasignación correspondiente) .

EDITAR : Gracias a timday por resaltar un bug en gcc / glibc donde la garantía no se cumple.

EDIT 2 : El comentario de Ben destaca un caso de borde intersting. Los requisitos en las rutinas de asignación son para aquellos proporcionados por la norma solamente. Si la aplicación tiene su propia versión, entonces no hay tal garantía en el resultado.


¡Trabajé en un sistema donde usaron la alineación para liberar un poco de su propio uso!

Usaron el bit impar para implementar un sistema de memoria virtual.

Cuando un puntero tenía el bit impar establecido lo usaban para indicar que apuntaba (menos el bit impar) a la información para obtener los datos de la base de datos, no los datos en sí.

¡Pensé que esto era un poco desagradable de codificación que era muy ingenioso por su propio bien!

Tony