Le nombre de symbole dans les libs C++ étant juste dantesque, tu te retrouves avec des temps de demarrage hallucinant et non ameliorable.
Il est vrai que dès qu'une classe a une fonction virtuelle, on se retrouve avec les vtable et les symboles RTTI (Runtime Type Information)
C'est effectivement un problème.
Petits rappel théorique pour ceux qui sont intéressé: (cedric, tu peux passer ce paragraphe)
Quand on a au moins une fonction virtuel dans une classe, le compilateur crée une vtable (une seule par classe dans tout le programme, pas une par instance de chaque classes). C'est une table qui contient un pointeur vers chaque fonction virtuelle, et aussi des information RTTI.
RTTI permet de faire fonctionner les exceptions, les dynamic_cast ou typeid
Le problème c'est que ces tables de pointeur de fonction doivent être "rellocated" au moment ou la bibliothèque est chargée en mémoire. En effet, les bibliothèques sont en général compilée en "Position Indépendent Code". Ça veux dire que le code est chargée a une position différente en mémoire à chaque fois, donc les pointeurs de fonction ont toujours une adresse différente. Dans le code en lui même, la plupart des référence à d'autre partie du code sont fait de manière relative. Mais les tables virtuelles doivent être en absolue. Donc les bibliothèques contiennent une "table de rellocations" qui donne les instructions au loader pour réécrire toute ces tables au lancement.
Un autre problème vient du fait que les symboles doivent en général doivent être exportés. Et comme ELF permet de remplacer des symboles (avec LD_PRELOAD), le loader doit retrouver chaque symbole par son nom dans les tables de symboles
Un des principes derrière C++ est « zéro overhead ». Mais cette règle est un peu violée par le RTTI.
Une solution est de faire compiler -fno-rtti. Qt n'utilise pas RTTI dans son propre code (pas d'exceptions, pas de dynamic_cast). Mais par défaut il est compilé avec parce que les utilisateurs veulent pouvoir utiliser ces fonctionnalités.
Mais ceux qui utilise Qt sur embarqué peuvent désactiver RTTI.
Par contre, le problème est un peu pareil en C dans une bibliothèque comme GTK, qui réécrit des « table virtuelles » a la main.
[^] # Re: Les iles
Posté par Gof (site web personnel) . En réponse au journal Conseils aux libristes, 3e partie : surmonter l’obsession du « toolkit ». Évalué à 10.
Il est vrai que dès qu'une classe a une fonction virtuelle, on se retrouve avec les vtable et les symboles RTTI (Runtime Type Information)
C'est effectivement un problème.
Petits rappel théorique pour ceux qui sont intéressé: (cedric, tu peux passer ce paragraphe)
Quand on a au moins une fonction virtuel dans une classe, le compilateur crée une vtable (une seule par classe dans tout le programme, pas une par instance de chaque classes). C'est une table qui contient un pointeur vers chaque fonction virtuelle, et aussi des information RTTI.
RTTI permet de faire fonctionner les exceptions, les dynamic_cast ou typeid
Le problème c'est que ces tables de pointeur de fonction doivent être "rellocated" au moment ou la bibliothèque est chargée en mémoire. En effet, les bibliothèques sont en général compilée en "Position Indépendent Code". Ça veux dire que le code est chargée a une position différente en mémoire à chaque fois, donc les pointeurs de fonction ont toujours une adresse différente. Dans le code en lui même, la plupart des référence à d'autre partie du code sont fait de manière relative. Mais les tables virtuelles doivent être en absolue. Donc les bibliothèques contiennent une "table de rellocations" qui donne les instructions au loader pour réécrire toute ces tables au lancement.
Un autre problème vient du fait que les symboles doivent en général doivent être exportés. Et comme ELF permet de remplacer des symboles (avec LD_PRELOAD), le loader doit retrouver chaque symbole par son nom dans les tables de symboles
Un des principes derrière C++ est « zéro overhead ». Mais cette règle est un peu violée par le RTTI.
Une solution est de faire compiler -fno-rtti. Qt n'utilise pas RTTI dans son propre code (pas d'exceptions, pas de dynamic_cast). Mais par défaut il est compilé avec parce que les utilisateurs veulent pouvoir utiliser ces fonctionnalités.
Mais ceux qui utilise Qt sur embarqué peuvent désactiver RTTI.
Par contre, le problème est un peu pareil en C dans une bibliothèque comme GTK, qui réécrit des « table virtuelles » a la main.