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¿Hay alguna garantía de alineación del retorno de la dirección mediante la nueva operación de C++?
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 regresado están alineados. 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.
En teoría. En la práctica, si está utilizando gcc + glibc y tipos de SSE en un sistema de 32 bits, tenga en cuenta http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795. – timday
@timday: este problema con los tipos de SSE también se aplicaba a las versiones recientes de MSVC++ (por ejemplo, .NET 2003). No he probado en la última versión, pero sospecho que todavía es el caso. –
El valor devuelto por la función de asignación de operador 'operator new []()', que se refiere a ese requisito, no es el mismo puntero que se obtiene del operador 'new []'. Esta respuesta es incorrecta –