La maggior parte dei programmatori esperti sa che l'allineamento dei dati è importante per le prestazioni del programma. Ho visto alcuni programmi scritti da programmatori che allocano una dimensione di buffer più grande del necessario e utilizzano il puntatore allineato come inizio. Mi chiedo se dovessi farlo nel mio programma, non ho idea di alcuna garanzia di allineamento dell'indirizzo restituito dalla nuova operazione di C++. Così ho scritto un piccolo programma per testareEsiste una garanzia di allineamento dell'indirizzo restituito dalla nuova operazione di 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");
Il compilatore che sto usando è Visual C++ espresso 2008. Sembra che tutti gli indirizzi della nuova operazione restituita siano allineati. Ma non sono sicuro. Quindi la mia domanda è: c'è qualche garanzia? Se hanno garanzia, non devo allinearmi, se no, devo.
In teoria. In pratica, se si utilizzano i tipi gcc + glibc e SSE su un sistema a 32 bit, tenere presente http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795. – timday
@timday: questo problema con i tipi SSE era valido anche per le versioni recenti di MSVC++ (ad esempio .NET 2003). Non ho provato l'ultima versione, ma ho il sospetto che sia ancora così. –
Il valore restituito dalla funzione di allocazione helper 'operator new []()', che riguarda tale requisito, non è lo stesso puntatore che si ottiene dall'operatore 'new []'. Questa risposta è sbagliata. –