В интервью по программированию, которое у меня было вчера, одна из программ, которые мне пришлось написать, закончилась тем, что была примерно такая:
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
Я знаком с оптимизацией возвращаемого значения (RVO), поэтому я просто упомянул, что возврат вектора не вызовет копию на популярных компиляторах (в качестве последней строки есть один оператор возврата, и никакие пути управления не могут возвращать другой объект в код, который я написал).
Однако интервьюер сказал мне, что, поскольку Blob
может быть сложным определяемым пользователем типом (UDT), компилятор, возможно, не сможет выполнить RVO. Он также добавил, что возврат a std::vector<Blob*>
увеличивает шансы, что компилятор выполнит копию.
Насколько я понимаю, способность компилятора выполнить RVO полностью не относится к типу возвращаемого объекта, за исключением не скопируемых объектов, для которых компилятор (должен?) отклонил код, даже если результирующий код мог бы скомпилировать без использования конструктора копирования.
Итак, был ли интервьюер прав? Может ли сложный тип возврата запретить компилятору применять RVO?