Quanto spesso dovrebbe essere usato RAII? [chiuso]

2

Ho cercato di imparare il C ++, ma è notoriamente tormentato da cattivi tutorial. Ho saputo di un piccolo trucco intelligente chiamato RAII (Acquisizione delle risorse è inizializzazione), dove si avvolge una variabile heap in un oggetto posto in pila. Si libererebbero le risorse nel distruttore di questo oggetto, quindi non ci si dovrebbe preoccupare di chiamare l'eliminazione sull'oggetto basato su heap. Tuttavia, so anche che si suppone di creare il minor numero di oggetti possibile, in modo da risparmiare RAM. Il che mi porta alla mia domanda, quanto dovrei usare RAII? Soprattutto in un progetto che crea un sacco di variabili heap.

    
posta CamelCaseCode 23.07.2015 - 06:51
fonte

1 risposta

6

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.

    
risposta data 23.07.2015 - 13:59
fonte

Leggi altre domande sui tag