Подтвердить что ты не робот

RVO для сложных пользовательских типов в С++

В интервью по программированию, которое у меня было вчера, одна из программ, которые мне пришлось написать, закончилась тем, что была примерно такая:

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?

4b9b3361

Ответ 1

Нет, используемые типы не должны влиять на оптимизацию.

Единственная причина, по которой я вижу использование указателей, заключается в том, что их дешевле копировать, если компилятор не выполняет RVO. Скорее всего, с самыми популярными компиляторами.