Debería devolver por valor.
El estándar tiene una característica específica para mejorar la eficiencia de la devolución por valor. Se llama "copia elisión", y más específicamente en este caso la "optimización del valor de retorno con nombre (NRVO)".
Los compiladores no tienen que implementarlo, pero de nuevo los compiladores no tienen que implementar la función de alineación (o realizar ninguna optimización). Pero el rendimiento de las bibliotecas estándar puede ser bastante pobre si los compiladores no optimizan, y todos los compiladores serios implementan inlining y NRVO (y otras optimizaciones).
Cuando se aplica NRVO, no habrá copia en el siguiente código:
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
Pero el usuario puede querer hacer esto:
std::vector<int> myvec;
... some time later ...
myvec = f();
Copiar la elisión no impide una copia aquí porque es una asignación en lugar de una inicialización. Sin embargo, aún debe devolver por valor. En C ++ 11, la asignación se optimiza mediante algo diferente, llamado "semántica de movimiento". En C ++ 03, el código anterior causa una copia, y aunque en teoría un optimizador podría evitarlo, en la práctica es demasiado difícil. Entonces myvec = f()
, en lugar de , en C ++ 03 debes escribir esto:
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
Existe otra opción, que es ofrecer una interfaz más flexible al usuario:
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
Luego, también puede admitir la interfaz existente basada en vectores además de eso:
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
Esto podría ser menos eficiente que su código existente, si su código existente se usa reserve()
de una manera más compleja que solo una cantidad fija por adelantado. Pero si su código existente básicamente llama push_back
al vector repetidamente, entonces este código basado en plantillas debería ser tan bueno.
f
?