In C++ è garantito un valore di ritorno prima che le variabili automatiche nella funzione vengano distrutte? Avviso Basket :: get:Valore di ritorno C++ creato prima o dopo la distruzione della var automatica?
class Basket
{
public:
// Gift is a struct containing safely copyable things like int or string
Gift gift;
// Used to protect access and changes to gift
Mutex mutex;
// Copy gift into present, while locked to be thread safe
void put (const Gift & gift)
{
Lock lock(mutex); // Constructor locks, destructor unlocks mutex
this->gift = gift; // Gift assignment operator
}
// Return a memberwise-copy of gift, tries to be thread safe (but is it?)
Gift get()
{
Lock lock(mutex); // Constructor locks, destructor unlocks mutex
return gift; // Gift copy constructor
}
};
ho bisogno Basket :: arrivare a svolgere il suo costruttore di copia Gift (dell'oggetto temperatura restituiti) prima della distruzione dell'oggetto di blocco. Altrimenti l'oggetto regalo che viene restituito può essere corrotto da una chiamata simultanea da mettere.
I miei test mostrano che la copia regalo viene effettivamente creata prima della distruzione della serratura, tuttavia è garantita? In caso contrario, sarà necessario creare un secondo temporaneo all'interno della funzione, ad esempio:
Gift get()
{
Gift result;
{
Lock lock(mutex);
result = gift;
}
return result;
}
Non esistono registri nello standard C++. (Bene, c'è la parola chiave 'register', ma questo ha perso il suo significato molto tempo fa.) Inoltre, la maggior parte degli oggetti non si adatterebbe in un singolo registro, comunque. – fredoverflow
Se un oggetto locale è stato restituito, quindi sicuro, dovrebbe essere copiato prima che fosse distrutto. Tuttavia, questo è qualcos'altro. Ho restituito un membro dati della classe, quindi la semantica di esattamente quando la copia si verifica sembra diversa. – maxpolk
@maxpolk Si sta restituendo il membro in base al valore. Ci sarà una copia a meno che il compilatore non possa ottimizzarlo per un incarico di riferimento come ha mostrato Remy. Se dovessi restituire un riferimento o un puntatore, il blocco verrebbe comunque distrutto dopo. – AJG85