How often should RAII be used?
Ogni volta che ha senso usare (cioè, ogni volta che si ha un'operazione che dovrà essere invertita / annullata / chiusa / finalizzata / impegnata / ecc., probabilmente si dovrebbe usare RAII).
However, I also know that you are supposed to create as few objects as possible, as to save RAM.
No; Questa è una forma di ottimizzazione prematura che è già abbastanza grave, ma si basa anche su un errore:
Il numero di variabili nel codice non dovrebbe essere un fattore limitante nell'uso di RAII, perché se hai bisogno di una variabile allocata, l'allocazione sarà la stessa, sia che si tratti di un wrapper o di un raw. Un ulteriore wrapper RAII non aggiungerà nulla di significativo all'ingombro della memoria dell'applicazione.
In altre parole, le seguenti parti di codice dovrebbero avere la stessa (o comparabile) impronta di memoria:
resource* allocate_resource() { return new resource{}; }
void release_resouce( resource * r ) { delete resource; }
// client code
auto r = allocate_resource();
release_resouce(r);
e
struct resource_ptr {
resource * r_;
resource_ptr() : r_ { new resource }{}
~resource_ptr() { delete r_; }
};
// client code:
resource_ptr p;
Sia resource*
nel primo campione che l'istanza resource_ptr nel secondo avranno la stessa dimensione (4 byte su sistemi a 32 bit) e le chiamate a nuovo / eliminazione sono in funzioni separate (che di nuovo, dovrebbero avere lo stesso impronta se in una struttura o al primo livello).
Qualcosa da tenere a mente:
RAII può anche essere tradotto per significare " Responsibility acquisition is initialization", nel qual caso significherà qualcosa di più astratto (e più grande) di "pointer / resource release in destructors". Si applica in modo efficace a qualsiasi operazione che richiede una controperazione successiva:
- i file che devono essere aperti devono essere chiusi
Le transazioni del database - dovranno essere confermate o annullate
- i mutex bloccati devono essere sbloccati
- le connessioni di rete che sono state aperte dovranno essere chiuse
Nessuna di queste è una variabile heap, ma RAII si applica naturalmente a tutte.