|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | ||
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 626 ![]() |
Citation:
Dans tous les cas, personnellement je preferes avoir des macro d'assertion testables, qui potentiellement peuvent lancer des exception..ou pas, mais qui log puis debugbreak avant de faire quoi que ce soit d'autre. (je sens qu'on a completement change de sujet au passage). Citation:
L'exemple que tu donnes n'a aucun interet parcequil est evident meme pour le le compilateur, tandis que si tu commences a complexifier c'est un autre sujet. Cela dit je n'ai pas le temps de faire le test moi meme, pardon. En revanche il est important de signaler que beaucoup d'ameliorations (en particulier dans gcc) ont ete faites pour effacer ce probleme, aucours des dernieres annees. Je n'ai pas compare aujourdhui mais ca serait interessant de faire un test complet, avec msvc, clang et gcc, voir l'impact aujourdh'ui, sur un projet de jeu. J'aurais bien propose un de mes projets comme sujet, peut 'etre ce prototype? http://radiantlasercross.com mais je n'ai jamais pris le temps de le compiler pour autre chose que msvc. |
||
|
00
|
|
|
#22 | ||||
|
Expert Confirmé
![]() Développeur informatique Inscription : décembre 2008 Messages : 777 ![]() |
Non, je me suis juste mal exprimé... je pensais aux contrôle d'erreur au sens large du terme, c'est à dire que je pense que mettre un saut classique vaut toujours mieux que rien, même si je préfère les exceptions au sauts classiques.
Citation:
Effectivement, dans le cas d'un environnement maîtrisé à 100%, les exceptions n'ont pas lieu d'être. Mais maîtrisé à 100% implique 0 connectivité au monde extérieur. Je n'ai jamais été un "consoleux" mais il me semble que la DS permet le multi-joueur en connectant plusieurs consoles, non? De ce fait, il y a un réseau qui se crée... Sinon, il y a aussi l'option ou le dev ne fait pas d'allocation dynamique, et que du coup, il n'y a pas de risque de buffer overflow. Sinon, risque d'explosion, encore une fois. Cela dis, pour tempérer mes propos, j'ajouterai qu'en plus de ne jamais jouer sur console que chez quelques potes, je n'ai jamais non plus développé de jeux pour console Citation:
![]() Blague à part (c'était juste pour me dérider en ce jeudi au temps pourri) il y a ce thread sur SO: http://stackoverflow.com/questions/6...n-handling-add Et les 2 premiers posts, avec leurs scores semblent montrer que globalement, le surcoût des exception est négligeable, tant au niveau de la taille du binaire que de l'exécution. Citation:
La ou j'ai commencé à comprendre leur rôle, c'est le jour ou je suis tombé sur un document traitant de l' "exception safety" de Boost. Citation:
Personnellement, quand je pense aux assertions, je pense à "assert()". Du coup, c'est automatiquement supprimé quand je passe en mode release. Depuis C++11, je devrais aussi penser à "static_assert()" (ou un truc du genre) qui permet juste une vérification par le compilo, et n'a donc aucune influence dans le binaire. Donc, du code censé contrôler les problème de code, les bugs introduits par le dev. Ah, c'est vrai, on pourrait aussi penser aux exceptions "std::logic_error" mais je ne sais pas quels sont leurs rôles et cas d'utilisations, donc j'ai tendance à ne pas y penser. Surtout qu'en général, en cas d'erreur de logique, ça me mène au crash peu après Donc je vois plus les exceptions, et contrôles d'erreurs en if, comme un moyen de prévenir et traiter les évènements sur lesquels on a aucune prise lors de la programmation: _ mémoire insuffisante pour traiter une opération _ rupture de réseau _ fichier d'entrée corrompu _ saisie utilisateur foireuse (genre il entre un texte dans un champ où on lui demande de mettre un nombre, et la conversion foire en lançant une exception) En effet ![]() PS: ta démo pourrait devenir un jeu d'arcade relativement fun |
||||
|
|
10
|
|
|
#23 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : août 2003 Messages : 4 527 ![]() |
Citation:
Et je crois que j'ai enfin trouvé : une assertion en phase de dév va non seulement crasher, mais aussi et surtout provoquer un core dump (man ulimit pour ceux sous *nix qui n'ont pas de core générés). Et un fichier core, c'est juste royal car la pile d'appel (sur tous les threads) est stockée au moment du crash. Nul besoin d'avoir une série de logs quand on dispose d'un état complet du programme au moment du plantage (et donc l'état de toutes les variables qui étaient encore en train de vivre). Il n'y a de fait pour moi aucune subtilité. - erreur de prog -> assertions => core dump => état complet (au détail des optims faites à notre insu et de certaines résolutions de meta-prog template) au moment du plantage. - erreur dans le contexte (très bien explicité par Freem) -> 110000 ifs, ou des exceptions. Et ça, ce n'est pas désactivable dans le produit final. Et ici même la question initiale se pose : "if ou exception?" ; "Quel est le mécanisme qui coute le moins cher -- quand non buggué -- sur la plateforme ciblée ?" (et effectivement, deux des articles traduits (/en cours de) couvrent ce sujet) Maintenant si les consoles ne peuvent pas générer de fichiers core (ou équivalent), je comprends que la situation soit pourrie et que vous deviez pervertir le fonctionnement des assertions pour tracer des choses comme la pile d'appel. Car je suis d'accord, un crash sans fichier core, cela n'apporte rien. (oui on peut forker la discussion) Reste le sujet connexe de la programmation défensive qui n'a pas encore été proprement abordé.
__________________
FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++ Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. |
|
|
|
20
|
|
|
#24 |
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 626 ![]() |
Ce que j'essayais vainement d'expliquer c'est que a part tester une verite, l'implmentation d'une assertion est vraiment totalement dependante de ce qu'on veut qu'elle fasse. Par exemple j'ai vu des assertions qui font ce que tu decris, mais aussi des assertions qui ne font que logger (quelle que soient les infos et leur forme, ca peut ne pas etre du texte) et continuer ensuite, ou bien crasher, ou bien juste declencher un debugbreak, etc.
Selon les types de jeux avoir des assertions qui stoppent le programme peut 'etre problematique meme si c'est bon pour que les programmeurs continuent a bosser. Du coup toutes les assertions ne sont pas equivalentes, et beaucoup de gens basent leur definition sur ce qu'ils ont vu et manipule alors que dans la pratique la variete de comportement des assertions est suffisamment importante pour facilement embrouiller une discussion comme celle ci. |
|
00
|
Copyright © 2000-2013 - www.developpez.com