Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1653 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Pourquoi la surchage a-t-elle si mauvaise réputation ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pourquoi la surchage a-t-elle si mauvaise réputation ?

n°869291
g012
Posté le 10-10-2004 à 01:43:57  profilanswer
 

Bonsoir bonsoir.
 
Bin alors je lis partout: le C++ peut être quasi aussi rapide que du C si on évite la ligature dynamique, telle lib dit: on a pas utilisé l'héritage virtuel pour éviter la chute de perfs, etc...
Alors moi je me suis posé la question: pourquoi c'est réputé si lent ?
Test:
 

Code :
  1. class Parent
  2. {
  3. public:
  4. virtual int getValue(int a) { return a+a; }
  5. virtual int getSecondValue(int a) { return 2*a-a; }
  6. };
  7. class Fils : public Parent
  8. {
  9. public:
  10. virtual int getValue(int a) { return a*a; }
  11. virtual int getSecondValue(int a) { return 4*a-a; }
  12. };
  13. int main()
  14. {
  15. Parent* p;
  16. Fils f;
  17. p = &f;
  18. p->getValue(3);
  19. p->getSecondValue(3);
  20. }


 
(je sais y'a pas de return dans main mais c pas la question)
Après compilation avec les 4 virtual, sous vc7.1 en mode debug sans optimisations, on obtient pour main:
 

Code :
  1. _main PROC NEAR
  2. ; 16   : {
  3. push ebp
  4. mov ebp, esp
  5. sub esp, 8
  6. ; 17   :  Parent* p;
  7. ; 18   :  Fils f;
  8. lea ecx, DWORD PTR _f$[ebp]
  9. call ??0Fils@@QAE@XZ
  10. ; 19   :  p = &f;
  11. lea eax, DWORD PTR _f$[ebp]
  12. mov DWORD PTR _p$[ebp], eax
  13. ; 20   :  p->getValue(3);
  14. push 3
  15. mov ecx, DWORD PTR _p$[ebp]
  16. mov edx, DWORD PTR [ecx]
  17. mov ecx, DWORD PTR _p$[ebp]
  18. call DWORD PTR [edx]
  19. ; 21   :  p->getSecondValue(3);
  20. push 3
  21. mov eax, DWORD PTR _p$[ebp]
  22. mov edx, DWORD PTR [eax]
  23. mov ecx, DWORD PTR _p$[ebp]
  24. call DWORD PTR [edx+4]
  25. ; 22   : }
  26. xor eax, eax
  27. mov esp, ebp
  28. pop ebp
  29. ret 0
  30. _main ENDP


 
En virant les 4 virtual:
 

Code :
  1. _main PROC NEAR
  2. ; 16   : {
  3. push ebp
  4. mov ebp, esp
  5. sub esp, 8
  6. ; 17   :  Parent* p;
  7. ; 18   :  Fils f;
  8. ; 19   :  p = &f;
  9. lea eax, DWORD PTR _f$[ebp]
  10. mov DWORD PTR _p$[ebp], eax
  11. ; 20   :  p->getValue(3);
  12. push 3
  13. mov ecx, DWORD PTR _p$[ebp]
  14. call ?getValue@Parent@@QAEHH@Z  ; Parent::getValue
  15. ; 21   :  p->getSecondValue(3);
  16. push 3
  17. mov ecx, DWORD PTR _p$[ebp]
  18. call ?getSecondValue@Parent@@QAEHH@Z  ; Parent::getSecondValue
  19. ; 22   : }
  20. xor eax, eax
  21. mov esp, ebp
  22. pop ebp
  23. ret 0
  24. _main ENDP


 
Moi les différences que je vois sont:
 - appel d'un constructeur de Fils, qui appelle un constructeur de Parent en virtual, ce qui n'est pas fait en non virtual. Vlà le code du constructeur de Fils au cas où on me le demande:

Code :
  1. ??0Fils@@QAE@XZ PROC NEAR    ; Fils::Fils, COMDAT
  2. ; _this$ = ecx
  3. push ebp
  4. mov ebp, esp
  5. push ecx
  6. mov DWORD PTR _this$[ebp], ecx
  7. mov ecx, DWORD PTR _this$[ebp]
  8. call ??0Parent@@QAE@XZ
  9. mov eax, DWORD PTR _this$[ebp]
  10. mov DWORD PTR [eax], OFFSET FLAT:??_7Fils@@6B@
  11. mov eax, DWORD PTR _this$[ebp]
  12. mov esp, ebp
  13. pop ebp
  14. ret 0
  15. ??0Fils@@QAE@XZ ENDP     ; Fils::Fils


 
 - un appel des fonctions via un offset depuis this, et une écriture d'ecx 2 fois pareil... donc une inutile.
 
Soit au coût de l'appel, 2 mov en plus et un call indirect, ce qui devrait pas faire plus de 3-4 cycles en plus par appel, ce que je trouve super négligeable comparé au temps d'exécution d'une fonction normalement longue/complexe... Je vois pas trop la différence avec utiliser un pointeur de fonction en C, qui serait le moyen que j'utiliserais normalement pour remplacer ces virtual.
 
Quelqu'un peut m'expliquer pourquoi on dit que c'est lent alors ?
Merci !

mood
Publicité
Posté le 10-10-2004 à 01:43:57  profilanswer
 

n°869292
Taz
bisounours-codeur
Posté le 10-10-2004 à 01:59:21  profilanswer
 

ben y a que les cons qui disent ça. Y a toujours des cons pour pas comprendre. Les gens familiers du C++ comprennent bien que la virtualité implique un traitement supplémentaire. Mais y aura toujours des abrutis qui font de la branlette intellectuelle.
 
 
Cela dit : si tu vires les virtual, magique, le compilateur génère un return 0 est rien d'autres :D

n°869305
Joel F
Real men use unique_ptr
Posté le 10-10-2004 à 09:38:11  profilanswer
 

Taz a écrit :

ben y a que les cons qui disent ça. Y a toujours des cons pour pas comprendre. Les gens familiers du C++ comprennent bien que la virtualité implique un traitement supplémentaire. Mais y aura toujours des abrutis qui font de la branlette intellectuelle.


 
Ces cons la si on les ecoutés, faudriat faire du C avec des cout et basta :|
 
le virtual comme le template c'ets bien quand on en sert correctement point.
 
Les onanistes du bulbe sont peut-etre juste un gros tas de mauvais codeur.

n°869309
masklinn
í dag viðrar vel til loftárása
Posté le 10-10-2004 à 09:43:47  profilanswer
 

Citation :

Ces cons la si on les ecoutés, faudriat faire du C avec des cout et basta :|


les cout c'est pas du C :/


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°869320
cris56
Posté le 10-10-2004 à 10:31:26  profilanswer
 

Masklinn a écrit :

Citation :

Ces cons la si on les ecoutés, faudriat faire du C avec des cout et basta :|


les cout c'est pas du C :/


 
il veut dire que ces cons en question font du c avec des cout en guise de c++

n°869335
masklinn
í dag viðrar vel til loftárása
Posté le 10-10-2004 à 11:03:19  profilanswer
 

cris56 a écrit :

il veut dire que ces cons en question font du c avec des cout en guise de c++


Ah oui, du C++ avec des malloc quoi :love:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Pourquoi la surchage a-t-elle si mauvaise réputation ?

 

Sujets relatifs
Fonction mail et mauvaise adresse email[CSS] Texte, DIV, mauvaise taille dans IE....
[Java][Bouley]Serializable : mauvaise instanciation des champsVariable USER_AGENT qui retourne la mauvaise info ?
Mauvaise requete MySQLEnregistrer des images en BLOB dans la BDD - Mauvaise idée ?
héritage et surchage d'opérateur[ DreamweaverMX ] Mauvaise gestion du PHP??
C#: mauvaise impression 
Plus de sujets relatifs à : Pourquoi la surchage a-t-elle si mauvaise réputation ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR