Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Rtti + Exception Handling

Iniciado por Pogacha, 23 de Abril de 2005, 05:47:50 PM

« anterior - próximo »

Pogacha

 Bueno, ... "el miedo siempre fue tonto" ... durante años le hui pues no sabia que resultados traeria pero a cuentas la mitad del codigo actual que yo tipeo no se en que forma termina en asm, así que pienso que RTTI y Exception Handling merecen lugar en mi programación.

Venia programando en c++ pero no con todas las facilidades que este me trae, y no las quise usar por miedo a lo desconocido y por que todo lo podia hacer de igual manera, pero requiero aumentar la capacidad de producción.

La preguntas:

1 - ¿Que cambios hay con usar RTTI y dinamic cast?,
he hecho mis pruebas, activando las opciones, y la verdad que el exe no parece crecer ni tampoco ralentarse.
2 - ¿ El uso es lo que es lento ?  o sea ... a diferencia de switch ( Clase->Tipo() )  { }
3 - ¿ Como lo implementa el compilador ? agrega un puntero o algo así ?

4 - ¿El exception handling solo agrega un dato en la pila y nada mas, o como lo maneja el compilador?
5 - Me interesa saber que si no hay excepciones de ningun tipo, que costo tendria de todas formas ?

Me da miedo de parecer ridiculo pues miro codigo de otros motores y no los utilizan para nada y no quiero escribir unas 30000 lineas para luego darme cuenta que son ralentizadores considerables.

Si hay saben de links que hablen especificamente del tema se los agradeceria también.

Saludos y agradezco toda información posible.


zupervaca

 yo como mucho te puedo decir que el rtti agrega codigo a tu codigo, pero ten en cuenta que el propio c++ ya agrega codigo extra por el lenguaje, logicamente en bucles muy grandes se notara la velocidad de usar rtti o no, en aplicaciones de gestion o proyectos grandes yo usaria rtti para que los demas programadores no puedieran "estropear" algo si no sabe el funcionamiento de clases, etc

no obstante cualquier programador de c++ o otro lenguaje orientado a objetos deberia saber que si una funcion retorna un tipo de clase el casting debe ser de ese tipo o de su base y no poner lo que le de la gana, pero esto nunca se sabe con seguridad y de ahi el uso de rtti en proyectos con varios programadores, yo estuve trabajando con un chaval que se saltaba las llamadas a las clases bases y ponia una clase base a boleo con lo que viendo esto lo ves todo  :D

saludos

gdl

 
Cita de: "Pogacha"1 - ¿Que cambios hay con usar RTTI y dinamic cast?,
he hecho mis pruebas, activando las opciones, y la verdad que el exe no parece crecer ni tampoco ralentarse.

Creo que en algunos casos y sin RTTI, el dynamic_cast no funciona. Aunque no pondría la mano en el fuego... <_<

Cita de: "Pogacha"2 - ¿ El uso es lo que es lento ?  o sea ... a diferencia de switch ( Clase->Tipo() )  { }

Lo que hace el compilador es más o menos eso, aunque algo se complica cuando hay herencia múltiple.

Cita de: "Pogacha"3 - ¿ Como lo implementa el compilador ? agrega un puntero o algo así ?

Añade un puntero extra ya sea al objeto o a la tabla de funciones miembro virtuales. Además, añade los objetos de descripción de tipos (que pululan por ahí en la memoria)  (asco)

Cita de: "Pogacha"4 - ¿El exception handling solo agrega un dato en la pila y nada mas, o como lo maneja el compilador?

No se usa la pila para el exception handling. Símplemente se busca la dirección de memoria donde ocurrió el throw en una tabla y esa misma tabla te dice qué catch le toca o si hay que relanzarlo en la función llamante.

Cita de: "Pogacha"5 - Me interesa saber que si no hay excepciones de ningun tipo, que costo tendria de todas formas ?

Ninguno, el coste se paga sólo si salta la excepción.

ethernet

 Teniendo en cuenta que actualmente todos los lenguajes modernos (C#, python,...) y no tan modernos (java, ADA) orientados a objetos los tienen por defecto (añadiendo también el garbage collector) es un indicardor de que es mucho más rentable esa ayuda por parte del lenguaje que no usarlos para optimizar.

Mi consejo: uso todo lo que te ayude a programar de forma más fácil y razonable y solo usa optimizaciones de ese tipo (evitar rtti, excepciones...) en el caso de programar una aplicación de alto rendimiento.

saludos

senior wapo

 
Cita de: "Pogacha"1 - ¿Que cambios hay con usar RTTI y dinamic cast?,
he hecho mis pruebas, activando las opciones, y la verdad que el exe no parece crecer ni tampoco ralentarse.
2 - ¿ El uso es lo que es lento ?  o sea ... a diferencia de switch ( Clase->Tipo() )  { }
3 - ¿ Como lo implementa el compilador ? agrega un puntero o algo así ?

4 - ¿El exception handling solo agrega un dato en la pila y nada mas, o como lo maneja el compilador?
5 - Me interesa saber que si no hay excepciones de ningun tipo, que costo tendria de todas formas ?
Te contesto de memoria, hace tiempo que no he visto el código desensamblado.

1. Cuando activas RTTI (/GR en VC++) se incluye por cada clase un registro type_info (una struct) que incluye el nombre de la clase y que sirve como ID único de esa clase. Si además usas dynamic_cast, se añadirá al ejecutable la información de la jerarquia de clases (para poder hacer el dynamic_cast puede ser necesario recorrerse toda la jerarquia buscando el ID de clase).

Si usas dynamic_Cast con GCC el ejecutable crecerá mucho, si usas VC++ solo incluirá en el ejecutable informacion RTTI de JERARQUIA para las clases en que uses el operador dynamic_cast (y sus clases base/derivadas). Con GCC, cuando activas RTTI (aun sin dynamic_cast) siempre incluye informacion de todas las clases, uses el cast o no.

2. clase->tipo() implementado por el programador siempre será más rápido a menos que se puediese resolver el cast en tiempo de compilación. dynamic_cast es caro y feo, pero cómodo.

3. Para VC++ en particular: Se añade delante de la vftable un puntero a la lista enlazada de registros RTTI para esa clase en particular. La información RTTI de una clase concreta no es una estructura, sino varias structs distintas enlazadas por punteros, una de las cuales contiene un array describiendo las clases base y apuntando a sus correspondientes structuras RTTI. Consideralo una especie de arbol N-ario invertido (multiples padres en lugar de multiples hijos). Es bastante feo.

4. Para VC++: Creo recordar que se modifica la direccion fs:[0] (area de datos del thread en ejecucion) con la dirección de una structura que contiene la descripción del manejo de la excepcion que se quiere detectar, a saber: direccion del codigo que maneja la excepcion, valor correcto de stack y cosas asi. Cuando salta una excepción, el sistema mira en fs:[0] si el valor contenido apunta a una estructura de excepción, y salta a la dirección indicada, actualizando el tipo de excepcion ocurida y tal. Nunca profundicé demasiado.

Basicamente, si no salta la excepción, es barato en VC++: modificar una direccion de memoria y guardar un valor en la pila. Busca en la web.

5. Poco en VC++, pero más en GCC que tiene tendencia a llenar de mierda el ejecutable. De todas formas, RTTI es lo que realmente engorda, las excepciones no tanto.


Ummm, después de haber escrito todo esto me siento muy friki   :blink:

PD: Las tildes que las ponga el tato.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.