¿Hay "magia" en el STL? [cerrado]


Permítanme comenzar explicando lo que quiero decir con "magia". Usaré dos ejemplos de Java:

  1. Cada clase hereda (directa o indirectamente) la clase Object.
  2. La sobrecarga del operador
  3. no está soportada por Java, pero el operador + está definido para los objetos String.

Esto significa que es imposible hacer una implementación de las clases Object y String en Java puro (*). Ahora esto es lo que quiero decir con "magia": para hacer una implementación de estas clases, necesitará algún apoyo especial del compilador.

Lo que siempre me gustó de C++ es que, por lo que sé, no hay 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 del STL que no se pueden implementar en C++ puro y necesitan algún soporte de compilador "mágico"/especial?


(*) Con "pure" quiero decir sin usar ninguna librería de clases.

 47
Author: Job, 2010-08-26

9 answers

En otras palabras, ¿se ha hecho algo al compilador para permitir un 'caso especial' que el STL necesitaba para funcionar?

No.

Todo fue implementado como código C++ 'puro', usando la magia de las plantillas.

Se ha hecho algún trabajo a los compiladores para mejorar la STL (estoy pensando en varias optimizaciones), pero de lo contrario, no, podría escribir toda la STL si realmente lo desea. Algunas personas lo hicieron - STLPort es una implementación que no tenía el respaldo de ninguna fabricante del compilador.

 52
Author: gbjbaanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 09:32:35

Como gbjbaanb dijo correctamente, el STL se puede implementar en C++ sin depender de ningún tipo de compilador "mágico".

Sin embargo, si vas a buscar en el código fuente STL para tu compilador, probablemente verás código que no es estándar, o que se supone que no debes escribir tú mismo.

El STL se puede implementar completamente en C++ estándar, pero eso no significa que a los escritores de compiladores no se les permita mejorarlo ocasionalmente, usando extensiones específicas del compilador. Para por ejemplo, pueden insertar código no estándar que asegura mejores mensajes de error, o tal vez funciona alrededor de algún defecto en su compilador, o tal vez habilita optimizaciones especiales mediante el uso de características adicionales de ese compilador específico.

También usan constantemente nombres que no se le permite usar. Por ejemplo, los parámetros de plantilla normalmente se denominan algo así como _Type, que, dado que comienza con un guion bajo seguido de una letra mayúscula, está reservado para la implementación. El la biblioteca estándar puede usarlos, pero tú y yo no. Así que si usted fuera a escribir su propia implementación STL, tendría que hacer algunos cambios menores, pero eso no es por ninguna magia, solo una manera de evitar conflictos de nombres entre la biblioteca estándar y el código de usuario.

 40
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-16 15:08:56

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 fue concurrente con el desarrollo del mecanismo de la plantilla C++, y en gran medida impulsó la inclusión de ciertas características. Creo que La búsqueda dependiente del argumento (ADL, también conocida como Búsqueda Koenig), los parámetros de la plantilla y los argumentos de la plantilla predeterminados llegaron a C++ para servir al desarrollo STL de Stepanov.

Así que, con STL, movieron la magia en el idioma en sí. Es bueno que el comité de estándares reconociera que si esas características fueran útiles para lo que se convertiría en la biblioteca estándar, ¡podrían ser útiles para el resto de nosotros también!

 15
Author: Drew Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 12:23:45

Si por STL se refiere solo a la parte de plantilla de la Biblioteca Estándar de C++, entonces es perfectamente posible implementarla sin ningún tipo de "magia". Si cada implementación dada realmente usa alguna " magia "es una pregunta diferente (hay porciones de STL donde" magia " ayudaría, pero no es absolutamente necesario).

Ahora, si estás hablando de toda la biblioteca Estándar de C++, entonces de hecho tiene un poco de "magia" en ella. El ejemplo clásico sería la biblioteca provista ::operator new y ::operator delete implementaciones. A menudo los llamamos "sobrecargables" en el lenguaje cotidiano, mientras que formalmente son reemplazables. El lenguaje C++ no ofrece dicha funcionalidad al usuario. El usuario no puede escribir una función reemplazable.

Otro ejemplo sería la macro offsetof (heredada de la Biblioteca Estándar de C). Si bien generalmente se implementa en "C pura", la implementación popular es en realidad ilegal desde el punto de vista pedántico (causa un comportamiento indefinido). No he visto cualquier implementación formalmente legal de offsetof, por lo que no estoy seguro de si son siquiera posibles.

Otro ejemplo sería (de nuevo, heredado de C) las macros para trabajar con argumentos variables. Obviamente no se pueden implementar en C puro o C++.

 14
Author: AnT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-09 22:10:51

Estoy bastante seguro de que algunos type_traits requieren la magia del compilador, por ejemplo has_trivial_constructor, has_virtual_destructor o is_pod.

 10
Author: fredoverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 12:54:02

std::initializer_list necesita soporte de compilador y no se puede reimplementar como otra clase (por lo que sé), aunque no estoy seguro de si cuenta ya que está en c++0x.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-02 13:58:04

C++0x va a estandarizar algunos de facto rasgos de tipo "mágicos".

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 soporte de compilador."

Véase 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

 5
Author: spraff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-08 08:25:49

Como bien dijo "gbjbaanb", no hay magia involucrada en la implementación de STL. Está escrito en C++puro. Usted podría implementarlo usted mismo, pero se ha hecho fácilmente disponible como una biblioteca para hacer su vida más simple.

 2
Author: Swapnil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 10:12:52

STL es estándar (Biblioteca de Plantillas estándar). El estándar especifica los requisitos para las implementaciones STL. Desde el punto de vista del uso, no hay "magia", no hay dependencias especiales de las que tenga que ocuparse. Se puede usar en cualquier compilador principal de C++, en todas las plataformas soportadas por esos compiladores.

 -2
Author: Cătălin Pitiș,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-26 09:33:38