Обычно это было бы оптимизировано, чтобы не включать копирование большого значения (так как 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;
}
};
работает ли семантика перемещения, даже если вызываемая функция выбрана во время выполнения?
Является ли функция статической или динамически разрешаемой, не влияет на возможность перемещения результата.
virtual
ничего не меняет по сравнению с нет. Компилятор все еще знает тип возвращаемого значения во время компиляции. Фактически это (почти *) гарантированно использует семантику перемещения вектора.
* Это может полностью исключить это через NRVO
Эта оптимизация называется copy elision (http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/) и предшествует c ++ 11. И семантика перемещения, и разрешение копирования — это одно и то же решение, и оба они являются частью стандарта, но исключение копирования реализовано компилятором, а семантика перемещения предлагает программисту контроль над этой оптимизацией.
Поведение должно быть таким же, виртуальным или нет.