darfeuille
Messages postés63Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention25 juillet 2005
-
8 juin 2005 à 15:57
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
8 juin 2005 à 16:52
Voila, je suis tout nouveau ici (qu'une semaine, mais j'essaie d'etre actif :p)
Mais je me pose une question :
Ca fait longtemps que je n'utilise plus de char*, parce que les
string m'ont paru vraiment plus simples d'usages, moins sujet a
problemes et plus "libres". Je pensais donc que c'était la norme,
pendant que j'étais enfermé à programmer dans mon coin.
Toutefois, depuis une semaine que je suis la, je remarque que ce n'est,
contrairement a ce que je pensais, pas la norme. Au contraire, j'ai
l"impression d'être un des seuls a m'en servir.
Pouvez vous m'expliquer cela? histoire de savoir si c'est juste une
histoire d'habitude, ou si c'est parce que string pose des problèmes.
Sachant que j'ai comparé (tests valables) les vitesses de mêmes opérations en char* et en string, et c'est quiff-quiff.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 8 juin 2005 à 16:10
Les string n'existent pas en C, seulement en C++ et donc les sources C utilisent que les char*. Et par habitude, certains (dont moi) utilise les char* aussi en C++. Ensuite les APIs Windows ne connaissent pas les string et seulement les char* (ou LPSTR)
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 8 juin 2005 à 16:42
en tout cas si tu veux faire du c++ (avec un code plus lisible et plus
facilement evolutif), prefere les std::string au char*. Tu peux de
toutes manieres convertir si besoin est (dans le cas d'appel aux API
windows) un std::string en char* avec la methode c_str().
90% des bugs en C sont dus a une mauvaise utilisation des char* et des
pointeurs en général, et la tres grande majorité des failles de
sécurité des programmes ou des systemes d'exploitation (windows et
unix) sont dus a des buffer overrun qui traduisent une mauvaise
utilisation des pointeurs.
C : gain en performance qd le code est écrit pour ca / problèmes de fuites de mémoires des que le prog devient important
C++ : bonnes performances si le code est optimisé dans les passages
critiques, mais code beaucoup plus robuste, stable, et dont le cout de
maintenance est beaucoup plus faible.
Problèmes de fuites de mémoire qd le code est mal concu (plus facile a eviter qu'en C)
darfeuille
Messages postés63Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention25 juillet 2005 8 juin 2005 à 16:25
Ok, merci
BruNews, je vais refaire mes tests alors, pour verifier. je les avais
fait sur un prog qui parse des fichiers de + 1GO mais g du me planter
alors (j'obtenais 1.5% de temps de traitement lié aux string en plus,
ces 1.5% faisant, sur le programme de parsing total, 1.1% a peu pres
(73% du temps cpu etant du aux traitement sur ceux-ci)
J'ai surement du me planter quelque part
Vous n’avez pas trouvé la réponse que vous recherchez ?
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 8 juin 2005 à 16:34
salut;
non tu t'es pas planté, tout dépend comment sont utilisés les std::string, mais les template de la STL sont très optimisés.
par ex: les allocations de memoire sont réduites au minimum (la meme
chaine en memoire peut etre reférencée par plusieurs strings), et la
comparaison entre deux string est en général plus rapide que
l'équivalent strcmp du C (tout simplement parce que la taille des
strings est connue avant le parcours de la chaine de caractere, ce qui
peut eviter des parcours inutiles en cas de tailles différentes...).
Si tu te sers correctement de resize ou reserve tu peux arriver a un ecart de temps avec les char* du C tres tres faible.
darfeuille
Messages postés63Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention25 juillet 2005 8 juin 2005 à 16:48
Ok, merci
Ca expliquerait alors peut etre pourquoi la diff sur mon prog est faible.
Tiens, j'en profite pour poser une aute question :
Mettons que j'ai une structure de la STL (au hasard un set), qui a été
rempli au fur et a mesure du programme, et qu'a un moment je n'en ai
plus besoin.
Est ce que faire monset.resize(0) suffit a libérer la mémoire des
éléments qu'il contenait, ou est ce qu'il faut faire autre chose?
(sachant que c'est au milieu d'un programme, donc monset existe
toujours ensuite)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 8 juin 2005 à 16:52
En général il y a une méthode clear pour vider les conteneurs.
Pour revenir au string, je pense que le principal avantage est que a
tout moment elles connaissent leur taille, ce qui est très utile
(concaténation par exemple).