Domanda

Ho una funzione che assomiglia a questo:

// Fetch 1 MB of data
void GetData(std::vector<char> & outData);

Il 1 MB è esagerato, ma voglio solo fare il punto che è preferibile evitare copie non necessarie.

Se aggiungo questo sovraccarico:

std::vector<char> GetData()
{
    std::vector<char> result;
    GetData(result);
    return result;
}

E allora come è probabile che RVO entreranno in gioco?

È stato utile?

Soluzione

Con la maggior parte dei compilatori ragionevolmente recenti (ad esempio, VS 2005 o più recente, GCC 3.4 o più recente), è essenzialmente determinata. Dico solo "più", perché non ho ancora testato ogni compilatore esistente. Ogni nuovo compilatore Ho guardato in probabilmente negli ultimi 5 anni o giù di lì ha incluso.

Altri suggerimenti

RVO molto probabilmente in calcio, in quanto si tratta di un'ottimizzazione semplice abbastanza, che è stato disponibile per un bel po '. Tuttavia, al fine di dare a questo pezzo di codice reale valore pratico nel codice anche moderatamente alte prestazioni avreste bisogno NRVO. NRVO è più difficile da incontrare, dal momento che è relativamente nuovo. Eppure è a disposizione. MS compilatore, per fare un esempio, attrezzi da quando VS2005.

Non credo che ci sia una risposta standard a questa:. Dipende dalla vostra compilatore e che cosa è in grado di

Se stai pensando di attuare questo per convenienza perché non basta provare a sul vostro compilatore (s) e sia un'occhiata al montaggio o il profilo it e vedere cosa succede? L'evidenza empirica su ciò che il compilatore fa in realtà è probabilmente meglio di indovinare quello che alcuni compilatori possono o non possono fare.

  

E allora come è probabile che RVO entreranno in gioco?

E 'compito di uno sviluppatore di software di pensare, di non compilatore.

I compilatori sono generalmente ottimizzati per rendere il codice buon lavoro bene -. Non quello cattivo

Personalmente, io uso la prima forma. Normalmente con un puntatore invece di riferimento -. Per evidenziare il fatto che il parametro è un'uscita, non ingresso

Si noti inoltre che quando si dice:

std::vector<char> GetData() 
{ 
//   :
    return result; 
}

vector<char> x = GetData();

il chiamato, result viene copiato in un "valore di ritorno", e poi nel chiamante, il "valore di ritorno" viene copiato in x. NRVO può sbarazzarsi di una di queste copie, ma non entrambi. Il compilatore è obbligato a chiamare il ctor copia, almeno una volta, perché deve assumere la ctor copia ha effetti collaterali che devono essere fatte.

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