2010-10-04 11 views
15

Ho una domanda relativa all'utilizzo di boost::lock_guard (o blocchi con scope simili) e l'utilizzo di variabili che devono essere protette dal blocco in un'istruzione return.Come utilizzare lock_guard quando si restituiscono dati protetti

Come è l'ordine di distruggere oggetti locali e copiare il valore restituito? In che modo l'ottimizzazione del valore di ritorno influisce su questo?

Esempio:

Data Class::GetData() 
{ 
    boost::lock_guard<boost::mutex> lock(this->mMutex); 
    return this->mData; 
} 

questo sarebbe corretto (se mData è la variabile protetto da mMutex)? Oppure avrei dovuto utilizzare un ambito locale e una come temporanea mostrato nell'esempio qui sotto:

Data Class::GetData() 
{ 
    Data ret; 
    { 
     boost::lock_guard<boost::mutex> lock(this->mMutex); 
     ret = this->mData; 
    } 
    return ret; 
} 

risposta

18

Basta un ritorno dritto come nel tuo primo esempio è corretta. Il valore di ritorno viene costruito prima che le variabili locali vengano distrutte e quindi prima che il blocco venga rilasciato.

0

Entrambi i pezzi sono equivalenti. Infatti per il caso # 1 - il compilatore C++ creerà la struttura descritta nel caso # 2. Quindi # 1 è preferibile.

3

Come è l'ordine di distruggere oggetti locali e copiare il valore restituito?

In genere, gli oggetti stack vengono distrutti in ordine inverso di creazione. Come precedentemente affermato, entrambi gli approcci specificati forniranno il comportamento desiderato.

In che modo influisce sull'ottimizzazione del valore di ritorno?

RVO non dovrebbe essere una preoccupazione qui - tutto ciò è costruire l'oggetto di output direttamente nel buffer di stack frame - evitando il sovraccarico di creare un oggetto temporaneo chiamato (come in esempio 2 sopra). Questo viene fatto prima che i distruttori locali vengano richiamati.

È meglio utilizzare il codice dell'esempio 1 sopra.

Problemi correlati