CLASSE CCHAINE

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 6 mars 2005 à 16:16
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 11 mars 2005 à 21:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29951-classe-cchaine

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
11 mars 2005 à 21:04
Oui, d'accord pour ca, mais la on parle de ce qui ne peut etre inliner, tels que les callbacks ou accessoirement les expressions vectorielles (mais trés utile dans les domaines scientifiques).

L'article montre en gros que les templates permettent de résoudre à la compilation pas mal de tuyauteries imbriquées bien complexes, pour peu qu'on enrobe ca de templates qui seront forcement dérouler et inliner à la compilation.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mars 2005 à 20:56
ben c'est clair, si j'ecris
strcpy(buff, psz);
le compilo met l'asm direct dans le code, il n'y a aucun appel de fonction car strcpy est macro.
Si on peut trouver + rapide, qu'on me le signale.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
11 mars 2005 à 20:39
Comment ca ? Qu'est ce que tu entends par "Aucun callback en C cause qu'il n'y a pas de fonctions" ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mars 2005 à 20:12
Je lis cela au debut:
The expression can be inlined into the function body, which results in faster and more convenient code than C-style callback functions.

Ai-je mal compris ? On parle de fonctions de chaines genre strcpy, strcat, etc... Aucun callback en C cause qu'il n'y a pas de fonctions, le compilo met tout l'asm direct dans le code, ces pseudos fonctions ne sont que des macros.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
11 mars 2005 à 19:59
Les tests serieux (ceux fais avec un vrai compilateur C++ et une vrai STL) montre en gros 5% de difference, comparé au cout de maintenance infiniment plus faible.

Globalement en C++ on est cencé atteindre des performances au dessus du C car l'optimiseur dispose de plus d'information sur le code (constance, typage tres puissant, OO, templates). En C la traduction est trop proche du source (c'est plus au programmeur d'optimiser).

BruNews, si tu as le temps, tu pourrais jeter un oeil à cet article (qui n'est qu'un apercu de l'iceberg) ?
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
11 mars 2005 à 09:26
Tiens, bj BN
C'est vrai, que rien ne vaut l'absence de classe et l'assembleur si on recherche la perf pure

Mais les classes sont tellement plus agréable pour la séparation des opérations et la compréhension du code que l'on recherche un moindre mal en utilisant le C++
De toute façon, ce n'est pas à toi qu'il faut l'apprendre.

et on est pas d'orient à réinventer et prouver la roue toutes les 30 secondes.
Généralisation et réutilisation sont nos leitmotivs !

Magicalement
BC
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 mars 2005 à 01:06
Si on cherche les performances, y a peu de chances qu'on utilise std::string ni quelque autre classe de chaine, alors...
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 mars 2005 à 20:18
par exemple, mais on prend surtout l'exemple des concatenation de chaines pour montrer à quel point l'absence d'information sur la taille est mortelle pour les performances.

std::string::operator+= est bien plus rapide que std::strcat pour concatener des chaines, de même std::string::size pulverise std::strlen, d'autant plus si la chaine est longue.
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
10 mars 2005 à 19:51
ui, size_t est là
il a une complexité de n, car il doit parcourir toute la chaine

prenons un exemple simple

si on veut afficher la chaine a l'envers,
tu va commencer par demander la taille n
et à la parcourir dans l'autre sens
soit 2n


en mémorisant la taille;
rappel mem : 1
parcours : n
soit n+1 ~ n

quoiqu'il en soit, autant stocker cette donnée...
++
Nono.
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 mars 2005 à 18:16
N'oubliez pas que std::size_t est la pour ca.

Un typedef membre public
typedef std::size_t size_type;

size_type m_iTailleChaine;
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
10 mars 2005 à 15:14
unsigned long n'est pas nécessaire si unsigned int est déjà employé

sur les systemes actuels, (ie quasi tous depuis win95)
'int' est équivalent à 'long'

une idée serait peut etre de passer en 64 bytes
avec unsigned long long
mais attention, on pert alors en portabilité car ce dernier type n'est pas défini pour tous les compilateurs

++
Nono & Vic
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
10 mars 2005 à 14:07
ha et tu peux aussi rajouter des const pour certaines méthodes; par exemple:

remplace int Taille(void);
par int Taille(void) const;

ca signifie que l'appel de la méthode Taille ne modifie pas l'object CChaine que tu manipules. Ca permet ainsi d'appeler Taille() sur une référence constante d'une CChaine.

a++
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
10 mars 2005 à 14:02
salut,
pourquoi un destructeur virtuel ? ta classe CChaine n'a pas de fonctions virtuelles; si elle est utilisée comme classe de base pour manipuler des classes dérivées il n'y aura pas de polymorphisme... donc ta classe ne sera pas utilisée comme classe de base pour manipuler des classes dérivées, donc pas besoin de destructeur virtuel.
non?
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
10 mars 2005 à 00:24
Pour la taille, plutôt préconiser de l'unsigned long ;)
++
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
8 mars 2005 à 14:27
Ok, merci pour vos conseils.
C'est vrai, j'aurais du penser aux const !

Merci magic_nono pour les idées, ta classe est très bien (bien que j'ai un peu de mal avec l'assembleur) !!!.

Je m'y attelle de ce pas.
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
8 mars 2005 à 12:01
Steve => cela permet parfois de gagner en vitesse et taille


bobbyantho>
lorsque tu aura modifié ceci, tes sources seront au moins 4 fois plus rapides...

en plus du point capital que Steve à cité,
il manque beaucoup de fonctionnalités (format,checkIn,...)
conversions....

jette donc un oeil sur les BString que tu trouvera dans quasi toutes mes sources
cela pourra te donner des idées pour améliorer considérablement cette classe.

Bons début,
++
Nono
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
6 mars 2005 à 16:16
Il manque tout les const, ce qui fait (entre autre) que tu n'as pas explicitement définie le constructeur de copie et l'opérateur d'affectation.
Il est aussi inutile de définir le même opérateur pour un char* (qui devrait etre const) si tu as déja définie la conversion char*->CChaine (constructeur).