W wywiadzie programowania miałem wczoraj jeden z programów miałem napisać skończyło się coś takiego:RVO dla złożonych typów zdefiniowanych przez użytkownika w języku C++
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
Znam return value optimization (RVO), więc właśnie wspomniałem, że zwrócenie wektora nie spowoduje kopii na popularnych kompilatorach (istnieje jedna instrukcja return jako ostatnia linia, a żadne ścieżki kontrolne nie mogą zwrócić innego obiektu w kodzie, który napisałem).
Jednak ankieter powiedział mi, że ponieważ Blob
może być złożonym typem zdefiniowanym przez użytkownika (UDT), kompilator może nie być w stanie wykonać RVO. Dodał, że zwrócenie wartości std::vector<Blob*>
zwiększy szanse, że kompilator wykona kopiowanie. Zgodnie z moją wiedzą, wydajność kompilatora w wykonywaniu RVO jest całkowicie nieistotna dla zwracanego obiektu, z wyjątkiem obiektów niekopiowalnych, dla których kompilator (powinien?) Odrzucić kod nawet jeśli wynikowy kod mógłby się skompilować bez wywoływania konstruktora kopiowania.
Czy wywiad był właściwy? Czy złożony typ zwracany może uniemożliwić kompilatorowi zastosowanie RVO?
Ktokolwiek przeprowadzał z tobą wywiad, nie zatrudniłbym. :) –
@ Robᵩ: Nie mówię, kto to był, ani dla kogo pracują (lub na to pytanie dotyczące wywiadu) :-) –