¿Por qué la implementación de STL es tan ilegible? ¿Cómo C++ podría haber sido mejorado aquí?
c++11 readability (3)
Además de las buenas razones por las que Robson y AshleysBrain ya han dado, una razón por la que las implementaciones de la biblioteca estándar de C ++ tienen nombres tan concisos y un código compacto es que prácticamente todos los programas de C ++ (unidad de compilación, realmente) incluyen una gran cantidad de encabezados de biblioteca estándar por lo tanto, se recompilan repetidamente (recuerde que están en gran parte en línea y basadas en plantillas, mientras que los encabezados de la biblioteca estándar de C solo contienen un puñado de declaraciones de funciones). Una biblioteca estándar escrita según las pautas de estilo "estándar de la industria" llevaría más tiempo compilarse y, por lo tanto, conduciría a la percepción de que un compilador en particular era "lento". Al minimizar los espacios en blanco y usar nombres de identificadores cortos, el lexer y el analizador tienen menos trabajo que hacer, y todo el proceso de compilación se completa un poco más rápido.
Otra razón que vale la pena mencionar es que muchas implementaciones de bibliotecas estándar (por ejemplo, Dinkumware, Rogue Wave (antigua), etc.) se pueden usar con varios compiladores diferentes con estándares y requisitos muy diferentes. Con frecuencia, existe una gran cantidad de macro hackers destinados a satisfacer cada plataforma compatible.
Por ejemplo, ¿por qué la mayoría de los miembros en la implementación de STL tienen el _M_
o _
o __
? ¿Por qué hay tanto código repetitivo?
¿Qué características de C ++ faltan para permitir que la implementación de vectores (por ejemplo) sea clara y más concisa?
Las implementaciones usan nombres que comienzan con un guión bajo seguido de una letra mayúscula o dos guiones bajos para evitar conflictos con las macros definidas por el usuario. Tales nombres están reservados en C ++. Por ejemplo, uno podría definir una macro llamada Type
y luego #include <vector>
. Si vector
implementaciones de vector
usaran Type
como nombre de parámetro de plantilla, se rompería. Sin embargo, no se permite definir macros llamadas _Type
(o __type
, type__
etc.). Por lo tanto, vector
puede usar con seguridad tales nombres.
Muchas implementaciones de STL también incluyen la comprobación de compilaciones de depuración, como la verificación de que dos iteradores son del mismo contenedor al compararlos, y la observación de iteradores que salen de los límites. Esto implica un código bastante complejo para rastrear el contenedor y la validez de cada iterador creado, pero es invaluable para encontrar errores. Este código también está entretejido con el código de lanzamiento estándar con #ifdefs, incluso en los algoritmos STL. Así que nunca será tan claro como su operación más básica. Sitios como este muestran la funcionalidad más básica de los algoritmos STL, indicando que su funcionalidad es "equivalente a" el código que muestran. Aunque no verás eso en tus archivos de cabecera.