Cuando una función C++ acepta un argumento std::vector
, el patrón habitual es pasar por const
de referencia, tales como:paso eficiente de std :: vector
int sum2(const std::vector<int> &v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
Creo que los resultados de este código en doble desreferencia cuando se accede a los elementos del vector, ya que la CPU debe primero desreferenciar v
para leer el puntero al primer elemento, cuyo puntero necesita desreferenciarse nuevamente para leer el primer elemento. Esperaría que sería más eficiente pasar una copia superficial del objeto vector en la pila. Dicha copia superficial encapsularía un puntero al primer elemento y el tamaño, con el puntero haciendo referencia a la misma área de memoria que el vector original.
int sum2(vector_ref<int> v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
rendimiento similar, pero mucho menos de conveniencia podrían lograrse haciendo pasar un par iterador de acceso aleatorio. Mi pregunta es: ¿qué tiene defectos con esta idea? Espero que haya alguna buena razón para que las personas inteligentes acepten pagar el costo de rendimiento de la referencia de vector, o que hagan frente a la inconveniencia de los iteradores.
Editar: Con base en los comentarios a continuación, ten en cuenta la situación si simplemente cambiar el nombre de la clase sugerido vector_ref
a rebanada o gama. La intención es usar pares de iteradores de acceso aleatorio con una sintaxis más natural.
¿Ha comparado realmente el código máquina generado en los dos casos? ¿O midió el rendimiento? –
¿Ha comprobado que efectivamente es así en el montaje? Tampoco creo que la convención de los pares de iteradores provenga de consideraciones de rendimiento, es una decisión de diseño (y de hecho impulsar está favoreciendo un concepto mucho más conveniente de objetos de gama de iteradores, aunque no he estudiado cómo funcionan exactamente). – UncleBens
No creo que tus comentarios realmente tengan sentido. Una referencia es un alias de un objeto. Como tal, no es más costoso acceder a una referencia a un objeto que a acceder al objeto original. Esta diatriba ligeramente inflamatoria es especulación de su parte, si hubiera hecho dos minutos de debida diligencia, no habría necesitado esta publicación. –