En una entrevista de programación que tuve ayer, uno de los programas que tenía que escribir llegó a tener algo como esto:RVO para los tipos definidos por el usuario complejas en C++
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
Estoy familiarizado con return value optimization (RVO), así que acabo de mencionar que devolver el vector no causaría una copia en los compiladores populares (hay una declaración de devolución única como la última línea, y ninguna ruta de control puede devolver otro objeto en el código que escribí).
Sin embargo, el entrevistador me dijo que dado que Blob
puede ser un tipo complejo definido por el usuario (UDT), el compilador puede no ser capaz de realizar RVO. Añadió que devolver un std::vector<Blob*>
aumentaría las posibilidades de que el compilador realice la elisión de copia.
Según mi entender, la capacidad del compilador para realizar RVO es completamente irrelevante para el tipo de objeto que se devuelve, salvo para objetos no copiables, para los cuales el compilador (¿debería?) Rechazar el código incluso si el código resultante podría compilar sin invocar el constructor de copia.
Entonces, ¿fue el entrevistador cierto? ¿Puede un tipo de devolución compleja evitar que el compilador aplique RVO?
Quien sea que te estaba entrevistando, yo no contrataría. :) –
@ Robᵩ: No estoy diciendo quién era o para quién trabajan (o la pregunta real de la entrevista) :-) –