C++ 14 introdotto "sized" versions of operator delete
, cioèCome utilizzerei gli operatori di dimensioni delete/delete [] e perché sono migliori?
void operator delete(void* ptr, std::size_t sz);
e
void operator delete[](void* ptr, std::size_t sz);
Leggendo N3536, sembra che gli operatori sono stati introdotti per aumentare le prestazioni. So che l'allocatore tipico utilizzato da operator new
"memorizza" la dimensione della memoria di massa da qualche parte, ed è così che il tipico operator delete
"sa" quanta memoria deve tornare al negozio gratuito.
Non sono sicuro, tuttavia, perché le versioni "dimensionate" di operator delete
siano utili in termini di prestazioni. L'unica cosa che può accelerare le cose è una operazione di lettura in meno per quanto riguarda le dimensioni dal blocco di controllo. Questo è davvero l'unico vantaggio?
In secondo luogo, come posso gestire la versione dell'array? AFAIK, la dimensione della matrice allocata non è semplicemente sizeof(type)*number_elements
, ma potrebbero esserci alcuni byte aggiuntivi assegnati poiché l'implementazione potrebbe utilizzare quei byte come byte di controllo. Che "taglia" dovrei passare a operator delete[]
in questo caso? Potete fornire un breve esempio di utilizzo?
Re la versione dell'array: questo è il problema del compilatore, non il tuo (si passa a ciò che è stato passato a 'operator new []' per allocare quella memoria). –
Non si usa questa frase dal documento * I moderni allocatori di memoria spesso allocano in categorie di dimensioni e, per ragioni di efficienza dello spazio, non memorizzano la dimensione dell'oggetto vicino all'oggetto. La deallocazione richiede quindi la ricerca dell'archivio delle categorie di dimensioni che contiene l'oggetto. Questa ricerca può essere costosa, in particolare perché le strutture dei dati di ricerca spesso non sono nelle cache di memoria. * Coprite ciò che state chiedendo? –
@ T.C. Ma come posso scoprire cosa è stato distribuito a 'operator new []'? È semplicemente 'sizeof arr'? – vsoftco