library - stl c++ functions
¿Hay "magia" en el STL? (9)
Al igual que gbjbaanb correctamente dicho, el STL se puede implementar en C ++ simple, sin depender de ningún tipo de compilador "mágico".
Sin embargo, si va a buscar el código fuente de STL para su compilador, probablemente verá un código que no es estándar o que no debe escribir usted mismo.
El STL se puede implementar completamente en C ++ estándar, pero eso no significa que los escritores del compilador no puedan mejorarlo de vez en cuando, utilizando extensiones específicas del compilador. Por ejemplo, pueden insertar código no estándar que garantice mejores mensajes de error, o tal vez funcione en torno a algún defecto en su compilador, o tal vez habilite optimizaciones especiales mediante el uso de características adicionales de ese compilador específico.
También usan constantemente nombres que no puedes usar. Por ejemplo, los parámetros de plantilla suelen denominarse como _Type
, que, dado que comienza con un guión bajo seguido de una letra mayúscula, se reserva para la implementación . La biblioteca estándar puede usarlos, pero tú y yo no. Entonces, si tuviera que escribir su propia implementación de STL, tendría que hacer algunos cambios menores, pero eso no se debe a ninguna magia, sino a una forma de evitar conflictos de nombres entre la biblioteca estándar y el código de usuario.
Permítanme comenzar con explicar lo que quiero decir con "magia". Usaré dos ejemplos de Java:
- Cada clase hereda (directa o indirectamente) la clase
Object
. - La sobrecarga del operador no es soportada por Java pero el operador
+
está definido para objetosString
.
Esto significa que es imposible realizar una implementación de las clases Object
y String
en pure (*) Java. Ahora esto es lo que quiero decir con "magia": para hacer una implementación de estas clases, necesitarás algún soporte especial del compilador.
Lo que siempre me gustó de C ++ es que, hasta donde yo sé, no existe tal "magia" en el STL, es decir, es posible implementar el STL en C ++ puro.
Ahora mi pregunta es: ¿es esto cierto? ¿O hay partes de STL que no pueden implementarse en C ++ puro y necesitan algún soporte de compilador "mágico" / especial?
(*) Con "puro" quiero decir sin usar ninguna biblioteca de clases.
C ++ 0x va a estandarizar algunos rasgos de tipo "mágico" de facto .
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2984.htm
"Rasgos de tipo adicionales para C ++ 0x"
Esto contiene algunas observaciones como "Se cree que XXXX requiere el soporte del compilador".
Ver también
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Type-Traits.html#Type-Traits
http://msdn.microsoft.com/en-us/library/ms177194(v=vs.80).aspx
Como dijo correctamente "gbjbaanb", no hay magia involucrada en la implementación de STL. Está escrito en C ++ puro. Puede implementarlo usted mismo, pero se ha hecho fácilmente disponible como una biblioteca para simplificar su vida.
Como otros han dicho, el STL es implementable en C ++ 98 estándar puro. Lo que no se ha dicho es que el desarrollo de la STL coincidió con el desarrollo del mecanismo de plantilla de C ++ y condujo en gran medida a la inclusión de ciertas características. Creo que Argument Dependent Lookup (ADL, también conocido como Koenig Lookup) , los parámetros de plantilla de plantilla y los argumentos de plantilla predeterminados vinieron todos a C ++ para servir al desarrollo STL de Stepanov.
Entonces, con STL, movieron la magia al lenguaje mismo. Es bueno que el comité de estándares haya reconocido que si esas características fueran útiles para lo que se convertiría en la biblioteca estándar, ¡también podrían ser útiles para el resto de nosotros!
Estoy bastante seguro de que algunos type_traits
requieren magia del compilador, por ejemplo has_trivial_constructor
, has_virtual_destructor
o is_pod
.
STL es estándar (biblioteca de plantillas estándar). El estándar especifica los requisitos para las implementaciones de STL. Desde el punto de vista del uso, no hay "magia", no hay dependencias especiales de las que tengas que ocuparte. Se puede usar en cualquier compilador de C ++ importante, en todas las plataformas compatibles con esos compiladores.
Si por STL se refiere solo a la porción de la plantilla de la Biblioteca Estándar de C ++, entonces es perfectamente posible implementarla sin ningún "mágico". Si cada implementación dada realmente usa cualquier "magia" es una pregunta diferente (hay porciones de STL donde "magia" ayudaría, pero no absolutamente requerido).
Ahora, si estás hablando de toda la biblioteca estándar de C ++, entonces sí tiene un poco de "magia". El ejemplo clásico sería las implementaciones de ::operator delete
::operator new
y ::operator delete
provided. A menudo los llamamos "sobrecargables" en el lenguaje cotidiano, aunque formalmente son reemplazables . El lenguaje C ++ no ofrece dicha funcionalidad para el usuario. El usuario no puede escribir una función reemplazable.
Otro ejemplo sería el offsetof
macro (heredado de la Biblioteca estándar C). Si bien generalmente se implementa en "C puro", la implementación popular es realmente ilegal desde el punto de vista pedante (provoca un comportamiento indefinido). No he visto implementaciones formalmente legales de offsetof
, así que no estoy seguro si son posibles.
Otro ejemplo sería (una vez más, heredado de C) las macros para trabajar con argumentos variables. Obviamente no pueden implementarse en C o C ++ puros.
en otras palabras, ¿se ha hecho algo al compilador para permitir un ''caso especial'' que el STL necesitaba para funcionar?
No.
Todo se implementó como código C ++ ''puro'', usando la magia de las plantillas.
Se ha trabajado un poco para que los compiladores mejoren el STL (estoy pensando en varias optimizaciones), pero de lo contrario, no, podrían escribir todo el STL si realmente quisieran. Algunas personas lo hicieron: STLPort es una implementación que no cuenta con el respaldo de ningún fabricante de compiladores.
std::initializer_list
necesita compatibilidad con el compilador y no se puede volver a implementar como otra clase (hasta donde yo sé), aunque no estoy seguro de si cuenta, ya que está en c ++ 0x.