In un'intervista di programmazione che ho avuto ieri, uno dei programmi che ho dovuto scrivere finito per avere qualcosa di simile:RVO per complessi tipi definiti dall'utente in C++
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
ho familiarità con return value optimization (RVO), quindi ho appena detto che restituire il vettore non causerebbe una copia su compilatori popolari (c'è una singola dichiarazione di ritorno come ultima riga, e nessun percorso di controllo può restituire un altro oggetto nel codice che ho scritto).
Tuttavia, l'intervistatore mi ha detto che dal Blob
potrebbe essere un tipo definito dall'utente complesso (UDT), il compilatore potrebbe non essere in grado di eseguire RVO. Ha inoltre aggiunto che restituire un std::vector<Blob*>
aumenterebbe le possibilità che il compilatore esegua la copia elision.
Per quanto mi risulta, la capacità del compilatore di eseguire RVO è completamente irrilevante rispetto al tipo di oggetto restituito, salvo per oggetti non copiabili, per i quali il compilatore (dovrebbe?) Rifiuta il codice anche se il codice risultante potrebbe compilare senza mai richiamare il costruttore di copie.
Quindi, l'intervistatore era giusto? Un tipo di ritorno complesso può impedire al compilatore di applicare RVO?
Chiunque ti stia intervistando, non lo assumerebbe. :) –
@ Robᵩ: Non sto affermando chi è stato, o per chi lavorano (o la vera domanda dell'intervista) :-) –