methodes virtuels et temps reel

methodes virtuels et temps reel - C++ - Programmation

Marsh Posté le 06-01-2005 à 03:09:45    

Bonjour, j'ai quelques questions qui me bloquent :
 
les voici :
Est ce que le garbage collector est pertinent dans un jeux de strategie en temps reel ?
 
Comment un compilateur c++ implemente un appel a une fonction virtuelle ?
 
Voila merci d'avance pour vos reponses !

Reply

Marsh Posté le 06-01-2005 à 03:09:45   

Reply

Marsh Posté le 06-01-2005 à 07:20:58    

Pourquoi un garbage collector et pas du reference counting, avec suppression immédiate ou retardée ? En gros: tu notes tous les objets dont tu sais que tu n'auras plus besoin, et 2 secondes plus tard, tu fais le grand nettoyage. C'est pratique lorsque tu as besoin d'effacer un objet, mais que tu sais qu'il y en a 2 ou 3 autres qui l'ont encore dans leurs dépendances.
 
Sinon, pour les fonctions virtuelles, ça dépend des environnements bien sûr. Mais en gros:
 
Chaque objet a un "champ" supplémentaire qui est le pointeur vers sa VTable. Cela permet d'effectuer toute sorte de manip sur la RTTI, et cela permet surtout de connaître l'addresse des fonctions virtuelles.
 
Il n'y a qu'une VTable en mémoire par classe. Et cette VTable n'est rien d'autre qu'un tableau de pointeurs sur fonctions membres.
 
Un compilo en 32 bits peut du coup implémenter un appel en:

load registre1, adress_vTable
jump [registre1+function_index_in_vTable*4]


 
Il y a donc un déréférencement en plus par rapport à une fonction normale. Certaines archis ont d'ailleurs des instructions spécialisées pour faire ça (ça simplifie le code, mais ça n'enlève pas le double-accès mémoire...).

Reply

Marsh Posté le 06-01-2005 à 08:31:51    

t'es sûr ?
me rappele pas bien mais le RTTI c'est pour le dynamic_cast pour moi ... qqchose comme le real time type ...  

Reply

Marsh Posté le 06-01-2005 à 08:42:15    

Il faut même mieux éviter toute allocation pendant la trame de jeu, ça coûte réellement cher. Si tu as besoin d'allocation "temps réel", utilise plutôt des pools, c'est plus efficace.
Sinon +1 sur toute la ligne avec Lam's.

Reply

Marsh Posté le 06-01-2005 à 08:47:58    

cricri_ a écrit :

t'es sûr ?
me rappele pas bien mais le RTTI c'est pour le dynamic_cast pour moi ... qqchose comme le real time type ...


En fait, j'ai menti (mais c'était pour simplifier). Une VTtable n'est généralement pas qu'un tableau de pointeurs, elle contient aussi les infos sur ta classe (donc, pointeur vers les vtables des classes dont elle dérive, nom de la classe, etc.). C'est ce qui permet de faire les dynamic_casts et les type_info...
 
Anecdote: Pour avoir une idée de la gueule des VTables de Visual C++, il suffit juste... de regarder le standard COM. En effet, Microsoft ne s'est pas embété, et s'est contenter de faire un mapping entre le format binaire des interfaces COM et le format des VTables générées pas VC++. C'est pour ça que DirectX (entre autres) est si rapide ;)

Reply

Marsh Posté le 06-01-2005 à 08:54:36    

cricri_ a écrit :

t'es sûr ?
me rappele pas bien mais le RTTI c'est pour le dynamic_cast pour moi ... qqchose comme le real time type ...


le RT de RTTI c'est pour RunTime, pas RealTime

Reply

Marsh Posté le 06-01-2005 à 16:13:02    

Lam's a écrit :

En fait, j'ai menti (mais c'était pour simplifier). Une VTtable n'est généralement pas qu'un tableau de pointeurs, elle contient aussi les infos sur ta classe (donc, pointeur vers les vtables des classes dont elle dérive, nom de la classe, etc.). C'est ce qui permet de faire les dynamic_casts et les type_info...


 
Bonjour à tous, je débarque ...
 
Ce qui permet de faire fonctionner les dynamic_cast, les type_info, c'est plutot l'existence (généralement optionelle) d'un pointeur de la vtbl sur un objet de type type_info. L'objet type_info est, comme un objet(!), crée à l'execution, d'ou RT (Run Time) de RTTI.

Reply

Marsh Posté le 06-01-2005 à 16:19:23    

++fab a écrit :

Bonjour à tous, je débarque ...


:hello:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-01-2005 à 16:22:39    

Taz a écrit :

le RT de RTTI c'est pour RunTime, pas RealTime


Ah vi, autant pour moi ...  :whistle:  

Reply

Marsh Posté le 06-01-2005 à 20:23:16    

ok merci beaucoup pour ces reponses, je crosi que j;ai ce kil me faut.

Reply

Marsh Posté le 06-01-2005 à 20:23:16   

Reply

Marsh Posté le 06-01-2005 à 23:07:23    

Lam's a écrit :


Un compilo en 32 bits peut du coup implémenter un appel en:

load registre1, adress_vTable
jump [registre1+function_index_in_vTable*4]




 
call, pas jump, on utilise jump plus tard pour le thuncking :o
(et une instance de classe peut avoir n v-table)

Reply

Marsh Posté le 06-01-2005 à 23:25:32    

chrisbk a écrit :


(et une instance de classe peut avoir n v-table)


 :non:  
Lam's a parfaitement raison sur ce point la.

Reply

Marsh Posté le 06-01-2005 à 23:27:14    

++fab a écrit :

:non:  
Lam's a parfaitement raison sur ce point la.


 
 
non il a tort. Une instance de classe a N V-table, avec N = (nombre de classe de base)-1 (avec 1 v-table si pas de classe de base, evidemment)

Reply

Marsh Posté le 06-01-2005 à 23:39:03    

j'avais pas vu que tu mettais "instance".
Lam's n'a pas dit "instance de classe", mais classe.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed