Preámbulo para personas con micro optimizadores
Recuerda:
"Los programadores pierden enormes cantidades de tiempo pensando o preocupándose por la velocidad de las partes no críticas de sus programas, y estos intentos de eficiencia en realidad tienen un fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Deberíamos olvidarnos de pequeñas eficiencias, digamos acerca de 97% del tiempo: la optimización prematura es la raíz de todo mal. Sin embargo, no debemos dejar pasar nuestras oportunidades en ese crítico 3% ".
(Gracias a la metamorfosis por la cotización completa)
No use una matriz C en lugar de un vector (o lo que sea) solo porque cree que es más rápido, ya que se supone que es de nivel inferior. Estarías equivocado
Use el vector predeterminado (o el contenedor seguro adaptado a sus necesidades) y luego, si su generador de perfiles dice que es un problema, vea si puede optimizarlo, ya sea utilizando un algoritmo mejor o cambiando el contenedor.
Dicho esto, podemos volver a la pregunta original.
Matriz estática / dinámica?
Las clases de matriz C ++ se comportan mejor que la matriz C de bajo nivel porque saben mucho sobre sí mismas y pueden responder preguntas que las matrices C no pueden. Son capaces de limpiar por sí mismos. Y lo que es más importante, generalmente se escriben usando plantillas y / o en línea, lo que significa que lo que parece una gran cantidad de código en la depuración se resuelve con poco o ningún código producido en la versión de lanzamiento, lo que significa que no hay diferencia con su competencia menos segura incorporada.
En general, se divide en dos categorías:
Matrices dinámicas
Usar un puntero a una matriz malloc-ed / new-ed será, en el mejor de los casos, tan rápido como la versión std :: vector, y mucho menos seguro (ver la publicación de litb ).
Entonces use un std :: vector.
Matrices estáticas
Usar una matriz estática será, en el mejor de los casos:
- tan rápido como el std :: array versión
- y mucho menos seguro
Entonces use un std :: array .
Memoria no inicializada
A veces, el uso vector
de un búfer en lugar de un búfer sin procesar incurre en un costo visible porque vector
inicializará el búfer en la construcción, mientras que el código que reemplaza no lo hizo, como señaló bernie en su respuesta .
Si este es el caso, puede manejarlo usando un en unique_ptr
lugar de un vector
o, si el caso no es excepcional en su línea de código, escriba una clase buffer_owner
que posea esa memoria y le brinde un acceso fácil y seguro, incluyendo bonos como cambiar el tamaño ( realloc
¿ usando ?), o lo que necesites.