Pregunta

He visto en algunos lugares la recomendación de usar std::array sobre matrices de estilo C en C++, afirmando que es una alternativa mejor y más segura sin gastos generales.Ver:

La matriz de contenedores estándar [...] no tiene gastos generales de espacio más allá de lo que necesita para sostener sus elementos, [...].En otras palabras, es muy parecido a una matriz incorporada sin los problemas.(Preguntas frecuentes sobre C++11)

Sin embargo, según tengo entendido, al ser un contenedor de plantillas allí voluntad será una sobrecarga en lo que respecta al tamaño del programa, ya que generará código para cada N diferente con el que se instancia una matriz.

Supongamos que mi programa usa std::array en varios lugares con varios números enteros diferentes para N, ¿esto conducirá a un código inflado?¿Es insignificante?

¿Debería preocuparme por esto para los parámetros de plantilla que no son de tipo en general?

¿Fue útil?

Solución

Yo no me preocuparía por eso.Si nos fijamos en la interfaz de std::array<T, N>, es muy pequeño y la mayoría de las funciones miembro (básicamente proporcionan contenedores para la manipulación del puntero) son frases ingeniosas que cualquier compilador decente optimizará o incorporará completamente en los niveles de optimización del modo de lanzamiento.

Además, no pagas por lo que no usas ya que las funciones miembro no virtuales no utilizadas (std::array<T, N> no tiene virtual Se garantiza que no se crearán instancias de funciones miembro) de plantillas de clase.Cotización estándar pequeña:

14.7.1 Creación de instancias implícitas [temp.inst]

11 Una implementación no instancia implícitamente una plantilla de función, una plantilla variable, una plantilla miembro, una función miembro no virtual, una clase de miembro o un miembro de datos estáticos de una plantilla de clase que no requiere instanciación.[...]

También hay algunos operadores relacionales sobrecargados. == y < que son semánticamente equivalentes a std::equal y std::lexicographical_compare.En la práctica, estos operadores también deberían implementarse en términos de estos algoritmos (quejarse a su proveedor si no lo hacen).

La única preocupación muy pequeña es una pequeña sobrecarga adicional en tiempo de compilación, pero no debería haber sobrecarga de tamaño de código ni de tiempo de ejecución.

Relacionados pero no idénticos:el Informe técnico sobre el rendimiento de C++ Realicé muchas evaluaciones comparativas cuidadosas en contenedores de clase delgada en torno a tipos integrados (int, double) y encontró una sobrecarga cercana a cero para la tecnología del compilador de 2006.Podrías repetir sus pruebas para verificar esto. std::array<T,N> vs. T[N]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top