Вы должны вернуться по стоимости.
В стандарте есть особенность для повышения эффективности возврата по значению. Это называется «копированием», а конкретнее в данном случае «оптимизацией именованного возвращаемого значения (NRVO)».
Компиляторы не должны реализовывать это, но опять же компиляторы не должны реализовывать встраивание функций (или вообще выполнять какую-либо оптимизацию). Но производительность стандартных библиотек может быть довольно низкой, если компиляторы не оптимизируются, а все серьезные компиляторы реализуют встраивание и NRVO (и другие оптимизации).
Когда применяется NRVO, в следующем коде не будет копирования:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
Но пользователь может захотеть сделать это:
std::vector<int> myvec;
... some time later ...
myvec = f();
Копирование не препятствует копированию здесь, потому что это назначение, а не инициализация. Однако вы все равно должны возвращаться по значению. В C ++ 11 назначение оптимизируется чем-то другим, называемым «семантикой перемещения». В C ++ 03 приведенный выше код действительно вызывает копию, и хотя теоретически оптимизатор может избежать этого, на практике это слишком сложно. Поэтому вместо myvec = f()
C ++ 03 вы должны написать это:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
Есть еще один вариант - предложить пользователю более гибкий интерфейс:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
Затем вы также можете поддерживать существующий векторный интерфейс, помимо этого:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
Это может быть менее эффективным, чем ваш существующий код, если ваш существующий код использует reserve()
более сложный способ, чем просто фиксированная сумма вперед. Но если ваш существующий код в основном обращается push_back
к вектору неоднократно, тогда этот код на основе шаблона должен быть таким же хорошим.
f
?