In C le funzioni di gestione memoria standard sono malloc()
, realloc()
e free()
. Tuttavia, gli allocatori stdlib C++ ne hanno solo due paralleli: non esiste una funzione di riallocazione. Naturalmente, non sarebbe possibile fare esattamente lo stesso realloc()
, perché copiare semplicemente la memoria non è appropriato per i tipi non aggregati. Ma ci sarebbe un problema, per esempio, questa funzione:Perché non ci sono funzionalità di riallocazione negli allocatori C++?
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
dove
ptr
è precedentemente assegnati con lo stesso allocatore pernum_now
oggetti;num_requested
> =num_now
;
e semantica come segue:
- se allocatore può espandersi in blocco di memoria a
ptr
dal formato pernum_now
oggettinum_requested
oggetti, lo fa (lasciando memoria aggiuntiva inizializzata) e restituiscetrue
; - altrimenti non fa nulla e restituisce
false
.
Concesso, questo non è molto semplice, ma gli allocatori, come comprendo, sono principalmente pensati per il contenitore e il codice dei contenitori è in genere già complicato.
Dato tale funzione, std::vector
, per esempio, potrebbe crescere come segue (pseudocodice):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
Allocators che sono incapaci di cambiare la dimensione della memoria del tutto potrebbe semplicemente attuare tale funzione incondizionato return false;
.
Ci sono così poche implementazioni di allocatore capaci di riallocazione che non ne vale la pena disturbare? O ci sono dei problemi che ho trascurato?
+1, questa è una domanda che mi ha sempre infastidito. –
Il punto di vista di Stroustrup su questa cosa: http://www2.research.att.com/~bs/bs_faq2.html#renew; esso delega il problema al funzionamento interno del vettore, ma non dice perché non esiste un meccanismo come "rinnovare" per semplificare la crescita dell'array. –
Non c'è nulla che impedisca a 'std :: vector' di farlo in alcuni casi (ad esempio, sa che sta usando l'allocatore standard). La libreria standard può utilizzare la conoscenza del sistema sottostante. – KeithB