Probabilità di RVO nome?
-
29-09-2019 - |
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?
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.