methodes virtuels et temps reel - C++ - Programmation
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 |
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...).
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 ...
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.
Marsh Posté le 06-01-2005 à 08:47:58
cricri_ a écrit : t'es sûr ? |
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
Marsh Posté le 06-01-2005 à 08:54:36
cricri_ a écrit : t'es sûr ? |
le RT de RTTI c'est pour RunTime, pas RealTime
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.
Marsh Posté le 06-01-2005 à 16:19:23
ReplyMarsh Posté le 06-01-2005 à 16:22:39
ReplyMarsh Posté le 06-01-2005 à 20:23:16
ok merci beaucoup pour ces reponses, je crosi que j;ai ce kil me faut.
Marsh Posté le 06-01-2005 à 23:07:23
Lam's a écrit :
|
call, pas jump, on utilise jump plus tard pour le thuncking
(et une instance de classe peut avoir n v-table)
Marsh Posté le 06-01-2005 à 23:25:32
chrisbk a écrit : |
Lam's a parfaitement raison sur ce point la.
Marsh Posté le 06-01-2005 à 23:27:14
++fab a écrit : |
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)
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.
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 !