В c ++ 11 может ли виртуальная функция эффективно возвращать большое значение с помощью семантики перемещения?

Обычно это было бы оптимизировано, чтобы не включать копирование большого значения (так как std::vector включена ли семантика перемещения):

std::vector<int> makeABigThing(){
std::vector<int> large_thing(1000, 0);
return large_thing;
}

Может ли это быть оптимизировано таким же образом, если функция является виртуальным методом:

struct Foo{
virtual std::vector<int> makeABigThing(){
std::vector<int> large_thing(1000, 0);
return large_thing;
}
};

работает ли семантика перемещения, даже если вызываемая функция выбрана во время выполнения?

5

Решение

Является ли функция статической или динамически разрешаемой, не влияет на возможность перемещения результата.

7

Другие решения

virtual ничего не меняет по сравнению с нет. Компилятор все еще знает тип возвращаемого значения во время компиляции. Фактически это (почти *) гарантированно использует семантику перемещения вектора.

* Это может полностью исключить это через NRVO

4

Эта оптимизация называется copy elision (http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/) и предшествует c ++ 11. И семантика перемещения, и разрешение копирования — это одно и то же решение, и оба они являются частью стандарта, но исключение копирования реализовано компилятором, а семантика перемещения предлагает программисту контроль над этой оптимизацией.

Поведение должно быть таким же, виртуальным или нет.

0