Domanda

Supponiamo di avere il seguente codice:

class some_class{};

some_class some_function()
{
    return some_class();
}

Sembra funzionare piuttosto bene e mi risparmia la fatica di dover dichiarare una variabile solo per ottenere un valore di ritorno.Ma non credo di averlo mai visto in nessun tipo di tutorial o riferimento.Si tratta di una cosa specifica del compilatore (visual C++)?Oppure sta facendo qualcosa di sbagliato?

È stato utile?

Soluzione

No, questo è perfettamente valido.Ciò sarà anche più efficiente poiché il compilatore è effettivamente in grado di ottimizzare il temporaneo.

Altri suggerimenti

La restituzione di oggetti da una chiamata di funzione è il modello di progettazione "Fabbrica" ​​ed è ampiamente utilizzato.

Tuttavia, dovrai fare attenzione se restituisci oggetti o puntatori a oggetti.Il primo di questi ti introdurrà alla copia dei costruttori/operatori di assegnazione, il che può essere una seccatura.

È valido, ma le prestazioni potrebbero non essere ideali a seconda di come viene chiamato.

Per esempio:

A a;
a = fn();

E

A a = fn();

non sono gli stessi.

Nel primo caso viene chiamato il costruttore predefinito, quindi viene invocato l'operatore di assegnazione su a che richiede la costruzione di una variabile temporanea.

Nel secondo caso viene utilizzato il costruttore di copia.

Un compilatore abbastanza intelligente capirà quali ottimizzazioni sono possibili.Ma, se il costruttore della copia viene fornito dall'utente, non vedo come il compilatore possa ottimizzare la variabile temporanea.Deve invocare il costruttore della copia e per farlo deve avere un'altra istanza.

La differenza tra l'esempio di Rob Walker si chiama Return Value Optimization (RVO) se vuoi cercarla su Google.

Per inciso, se vuoi assicurarti che il tuo oggetto venga restituito nel modo più efficiente, crea l'oggetto sull'heap (cioè tramite new) utilizzando shared_ptr e restituisci invece shared_ptr.Il puntatore viene restituito e il riferimento conta correttamente.

Questo è C++ perfettamente ragionevole.

Questo è C++ perfettamente legale e qualsiasi compilatore dovrebbe accettarlo.Cosa ti fa pensare che potrebbe fare qualcosa di sbagliato?

Questo è il modo migliore per farlo se la tua classe è piuttosto leggera: voglio dire che non è molto costoso farne una copia.

Un effetto collaterale di questo metodo, tuttavia, è che tende a rendere più probabile la creazione di oggetti temporanei, sebbene ciò possa dipendere da quanto bene il compilatore può ottimizzare le cose.

Per le classi più pesanti che vuoi assicurarti che non vengano copiate (ad esempio un'immagine bitmap di grandi dimensioni), allora è una buona idea passare cose del genere come parametro di riferimento che poi viene compilato, solo per essere assolutamente sicuro che non verranno creati oggetti temporanei.

Nel complesso può succedere che semplificare la sintassi e rendere le cose più dirette possa avere l'effetto collaterale di creare più oggetti temporanei nelle espressioni, qualcosa che dovresti tenere a mente quando progetti le interfacce per oggetti più pesanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top