1170

Folco (./1156) :
squalyl -> J'espère que le mécanisme de typage dynamique n'est mis en place que quand nécessaire, sinon boujour les perfs ^^

C'est toujours mis en oeuvre puisque les méthodes sont virtuelles. Mais ça a un impact négligeable sur les perfs, considère plutôt que le fait qu'une méthode soit virtuelle ou non a un rapport avec la conception, pas les perfs ;-)
./1163> OCP (posté dans un lien à JK). Ce n'est pas forcément souhaitable que les méthodes soient redéfinissables ;-)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1171

Hmm non, en réalité, le fait qu'une méthode soit virtuelle a un impact tout sauf négligeable sur les perfs.
T'as qu'a te documenter sur les astuces utilisées par la VM Java, ou le JIT du CLR (mais là ça ne concerne que les interfaces et les delegate vu que par défaut les méthodes sont non virtuelles… y'a encore de la marge en optimisation côté MS) pour réduire l'impact que ça a sur les performances, tu comprendras.
Mais oui, après on est d'accord, il ne faut pas se priver des méthodes virtuelles pour une bête raison de performance. Il faut une raison bien justifiée pour ça. Les performances peuvent l'être dans certains cas, mais pas toujours. (Si coût de l'appel ≥ coût de la méthode pour une méthode critique… Par exemple si ta méthode virtuelle est appelée en boucle un grand nombre de fois, mais ne fait que 2 additions… )
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1172

Brunni (./1170) :
Mais ça a un impact négligeable sur les perfs, considère plutôt que le fait qu'une méthode soit virtuelle ou non a un rapport avec la conception, pas les perfs ;-)

Comme Golden, j'ai lu tout le contraire... (d'où ma réponse à squalyl, j'aurais pas sucé ça de mon pouce grin)
GoldenCrystal (./1171) :
Mais oui, après on est d'accord, il ne faut pas se priver des méthodes virtuelles pour une bête raison de performance.

J'approuve. smile

1173

Folco (./1150) :
Oui, il est où le problème du nombre de classe ? La consommation mémoire et cpu ? (mécanismes à mettre en place pour chaque classe toussa)
Pour moi, c'est qu'une question de place dans l'IDE à mes yeux hein grin

C'est surtout que je trouve ça crade. L'icône Ouvrir d'une application est une icône, pas une "icône ouvrir, sous-classe de icône". Question performances, ça ne change pas grand chose. Ça risque juste de prendre de la place dans l'exécutable (table de symboles etc.). Mon objection est liée à la conception, pas à la performance.
Folco (./1156) :
squalyl -> J'espère que le mécanisme de typage dynamique n'est mis en place que quand nécessaire, sinon boujour les perfs ^^

Les méthodes virtuelles ne fonctionnent pas à travers un mécanisme de typage dynamique, mais à travers un simple pointeur dans la classe de base qui pointe sur une table des fonctions virtuelles (vtable). Donc la pénalité que tu te tapes, ce sont 2 lectures de pointeurs en mémoire (le pointeur sur la vtable et l'entrée dans la vtable) par appel de fonction virtuelle, mais ça s'arrête là.

Le typage dynamique (RTTI = run-time type information), c'est autre chose, c'est utilisé pour dynamic_cast notamment, c'est activé par défaut, mais peut être désactivé avec -fno-rtti.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1174

Ah, j'ai lu autre chose. Je suis pas assez calé pour poursuivre...

1175

Oué enfin le but c'était pas de troller sur le fait que c'est négligeable ou non pour les perfs, mais c'est surtout pour dire que c'est avant tout un problème de conception, et qu'il ne faut pas trop regarder les perfs pour l'instant wink
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1176

Kevin Kofler (./1173) :
C'est surtout que je trouve ça crade. L'icône Ouvrir d'une application est une icône, pas une "icône ouvrir, sous-classe de icône". Question performances, ça ne change pas grand chose. Ça risque juste de prendre de la place dans l'exécutable (table de symboles etc.). Mon objection est liée à la conception, pas à la performance.
C'est un très bon modèle de conception, au contraire… Peut-être un des meilleurs…
Le nom choisi par Folco n'est certes pas idéal. Typiquement, on appellerait ça une commande. (Ouais, c'est un modèle de commandes quoi ^^)
Tu as une commande, avec un nom, un icône, une description, et une action qui est éxécutée.
Tu peux associer ta commande à un bouton de barre d'outils, un menu, un bouton standard, bref n'importe quoi. Les éléments prennent automatiquement le nom et l'icône associés à la commande, et lorsque tu active ces élément, la commande est éxécutée.
C'est le modèle le plus flexible qu'il est possible de concevoir (à ma connaissance), et il te permet d'avoir une interface utilisateur flexible et évolutive, avec un code propre et clair (contrairement au fouillis que tu as en général, avec les trucs genre un contrôle = une méthode ou bien les trucs crades tels que listeners et assimilés)
Donc la pénalité que tu te tapes, ce sont 2 lectures de pointeurs en mémoire (le pointeur sur la vtable et l'entrée dans la vtable) par appel de fonction virtuelle, mais ça s'arrête là.
MAIS ce double déréférencement est atroce au niveau des performances. tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1177

Si tu veux contredire Kevin, faudra trouver mieux, parce que niveau perfs faut pas déconner quand même grin
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

1178

J'aurai bien été plus précis, mais il faudrait que je vérifie mes informations avant (parce que ça fait longtemps que je me suis plus préoccupé de ça), et là il est trop tard, donc flemme. grin
(Mais avec un peu de chances, vous le ferez pour moi… fesses ?)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1179

Le bon concept, c'est qu'une commande = un objet, pas une classe. La classe est toujours la même.
Cf. par exemple comment est conçu KAction. Il y a quelques sous-classes pour quelques actions particulières, mais pour presque toutes les actions, on utilise KAction directement sans la dériver et on connecte juste les signaux et slots qu'il faut.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1180

Oui non mais en C++ pur, ya pas de signaux et de classes, donc je vais dériver.

Génial Golden ta ptite synthèse sur les commandes, c'est plus général que ce que j'ai dit en effet, je vais faire comme ça c'est énorme.

Sinon, pour palier aux manques de signaux et slots du C++, j'ai pensé à ça :
- Ma "première classe" dans l'ordre des créations instancie un objet "communication" dont tous les objets "parlants" du programme recevront un pointeur.
- Chaque objet "parlant" héritent d'une classe "Receive" qui implémente receiveMsg(int n)
- Chaque objet s'enregistre dès sa construction : Communication->register(this, MyID)
- Objet X qui parle à objet ID_truc : Communication->SendMsg(ID_truc, int x)
- Comm qui répercute à ID_truc : entry[ID_truc].ptr->receiveMsg(x)

Donc on a un cast de entry[ID_truc].ptr en "Receive", puis la méthode est appelée.

Ca marcherait ? Si oui, ça serait bien, ça ferait une chouette utilisation de l'héritage multiple et du polymorphisme ^^ (me dites pas que ça marcherait pas hein ? cry)




Parce que ma "messagerie" initiale, en faisant remplir des champs de "Communication", lisibles par les autres objets, avait une limitation assez géniale : comme chaque objet est traité une fois par frame, et qu'il peut donc regarder ses messages une fois par frame, la communication entre objets et le moindre bout de protocole dépend du fps trioui
Immaginez si les protocoles étaient faits comme ça, on aurait droit à des pubs du genre "Sony sort un moniteur 150 Hz qui améliore considérablement votre connexion internet". La classe, non ? #triclasse#

1181

Thepro (./1158) :
aze (./1155) :
(j'ai édité une 50aines de fois, je sais pas si tu as eu la dernière version mod.gif )
Peut-être que tu devais éditer encore pour corriger ce genre de chose :
a.f(); // b::f
a.g(); // a::f
tongue

trioui
avatar

1182

(Il faut éditer encore, tu as fait cette erreur deux fois grin)
avatar

1183

Kevin Kofler (./1173) :
Les méthodes virtuelles ne fonctionnent pas à travers un mécanisme de typage dynamique, mais à travers un simple pointeur dans la classe de base qui pointe sur une table des fonctions virtuelles (vtable). Donc la pénalité que tu te tapes, ce sont 2 lectures de pointeurs en mémoire (le pointeur sur la vtable et l'entrée dans la vtable) par appel de fonction virtuelle, mais ça s'arrête là.

Pas tout à fait. Après il y a un appel à une procédure indirect (jsr (a0) pour les intimes du 68000).
Or cet appel casse la pipeline car le processeur n'utilise pas sa prédiction dynamique pour les appels indirects (pour diverses raisons, complexité de la prédiction essentiellement) pour alimenter la pipeline.
A noter que je crois que sur les x86 modernes (>= core 2 et >= phenom), ils ont ajouté cette prédiction des appels indirects.

1184

Thepro (./1182) :
(Il faut éditer encore, tu as fait cette erreur deux fois grin)

je vais locker ce putain de post angry
grin
avatar

1185

Folco (./1180) :
Donc on a un cast de entry[ID_truc].ptr en "Receive", puis la méthode est appelée.
Hm, pourquoi y aurait-il un cast ? entry peut être une liste de Receive *, non ?

Et oui, ça marcherait très bien. Tu peux même faire de ta classe Communication un singleton, ça t’évitera d’avoir à faire ta bidouille en début d’exécution.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

1186

./1183 > Tiens, donc en fait de nos jour, les méthodes virtuelles ne seraient enfin plus pénalisantes ? \o/
(En tout cas merci de l'explication, ça m'a évité d'avoir à vérifier mes infos tongue)

Sinon Folco, est-ce que tu as vraiment besoin d'un mécanisme si sophistiqué dans ton projet ? Tu as vraiment des messages susceptibles d'être traités par plus d'un objet par émission ?
Ce modèle est plutôt standard, mais dans le cas général, tu en as quand même rarement besoin. (Typiquement, ça te sert quand tu développes une lib)
Surtout, dans ton cas, c'est probablement trop général. (Tu ne veux probablement pas envoyer tous les messages à tous les objets)
Tu as des exemples des messages que tu voudrais transmettre, à titre d'info ?
(Et oui, c'est un bon modèle, je me demande juste si c'est adapté à ce que tu veux faire)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1187

aze (./1184) :
Thepro (./1182) :
(Il faut éditer encore, tu as fait cette erreur deux fois grin)

je vais locker ce putain de post angry
grin

J'ai lu en diagonale, mais ceci me semble suspect :
aze (./1152) :
b->g(); // a::f car b de type A*

trigni

1188

Folco (./1180) :
Oui non mais en C++ pur, ya pas de signaux et de [slots], donc je vais dériver.

Le C++ sans signaux et slots (et sans Qt en général) n'a aucun intérêt.
Sinon, pour palier aux manques de signaux et slots du C++, j'ai pensé à ça :
- Ma "première classe" dans l'ordre des créations instancie un objet "communication" dont tous les objets "parlants" du programme recevront un pointeur.
- Chaque objet "parlant" héritent d'une classe "Receive" qui implémente receiveMsg(int n)
- Chaque objet s'enregistre dès sa construction : Communication->register(this, MyID)
- Objet X qui parle à objet ID_truc : Communication->SendMsg(ID_truc, int x)
- Comm qui répercute à ID_truc : entry[ID_truc].ptr->receiveMsg(x)
Donc on a un cast de entry[ID_truc].ptr en "Receive", puis la méthode est appelée.

Et voilà, tu viens de réinventer un système de signaux et de slots (en moins bien tongue).
Sasume (./1185) :
Et oui, ça marcherait très bien. Tu peux même faire de ta classe Communication un singleton, ça t’évitera d’avoir à faire ta bidouille en début d’exécution.

Ou tout simplement un .cpp avec des variables/fonction static pour ce qui est privé et déclarées dans le .h pour ce qui est public, comme en C. Les singletons, ça sert moyennement en C++, grâce à la compatibilité avec le procédural.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1189

Oui mais il me semble qu’il a envie d’apprendre la programmation objet.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

1190

Kevin Kofler (./1188) :
Folco (./1180) :
Oui non mais en C++ pur, ya pas de signaux et de [slots], donc je vais dériver.
Le C++ sans signaux et slots (et sans Qt en général) n'a aucun intérêt.
Donc le C++ n'a aucun intérêt ? (Bon je suis limite d'accord sur ce point)
Donc le C n'a aucun intérêt. (Soit)
Alors pourquoi avoir codé Qt en C++ dans ce cas ?
Et voilà, tu viens de réinventer un système de signaux et de slots (en moins bien tongue).
Il a surtout réinventé le système de passage de messages de manière correcte. Je crois que ça date bien d'avant tes signaux et slots chéris. (Pourtant c'est toujours utilisé de nos jours)
Ou tout simplement un .cpp avec des variables/fonction static pour ce qui est privé et déclarées dans le .h pour ce qui est public, comme en C. Les singletons, ça sert moyennement en C++, grâce à la compatibilité avec le procédural.
Donc tu sais implémenter une classe abstraite avec du procédural ? Ou passer un ensemble de méthodes en tant qu'objet ? (Sans aucun hack)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1191

GoldenCrystal (./1191) :
Donc le C++ n'a aucun intérêt ? (Bon je suis limite d'accord sur ce point) Donc le C n'a aucun intérêt. (Soit)


rholala c'te généralisation, c'est juste le ++ qui sux, le C est très bien lui, il permet de gagner plein de temps sur l'asm (quand le compilo sux pas)

1192

Le C++ est incomplet, Qt lui rajoute tout ce qui lui manque.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1193

GoldenCrystal (./1190) :
Alors pourquoi avoir codé Qt en C++ dans ce cas ?

Ben, pour lui donner un intérêt, tiens embarrassed .

Enfin Franchement, je ne pense pas comme Dbl-K: J'ai trop l'habitude d'utiliser des pointeurs de fonction statiques (grâce à Windows) pour m'offusquer de l'absence de signaux/slots.
Par contre, j'abhorre les bibliothèques qui demandent des fonctions callback sans paramètre "user" (comme qsort()).

Edit: Oups, ninja.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

1194

Pen^2 (./1187) :
J'ai lu en diagonale, mais ceci me semble suspect :
aze (./1152) :
b->g(); // a::f car b de type A*

trigni

non ça c'est correct par contre embarrassed j'ai du revérifier deux fois grin
(heureusement c'est l'exemple le plus important tongue)
avatar

1195

Kevin Kofler (./1192) :
Le C++ est incomplet, Qt lui rajoute tout ce qui lui manque.

trigni
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

1196

aze (./1194) :
Pen^2 (./1187) :
J'ai lu en diagonale, mais ceci me semble suspect :
aze (./1152) :
b->g(); // a::f car b de type A*

trigni

non ça c'est correct par contre embarrassed j'ai du revérifier deux fois grin
(heureusement c'est l'exemple le plus important tongue)

aze (./1152) :
b->g(); // a::f car b de type A*

?

1197

bordel de merde >_<
avatar

1198

aze > il fallait dire que c'était intentionnel, pour voir si tout le monde suivait bien oui
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

1199

hehe

1200

ouais, bande de nuls !
(sauf pen^2)
avatar