Char * et string

Résolu
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005 - 8 juin 2005 à 15:57
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 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.



Merci, Darfeuille

7 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
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)
3
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
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)
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 juin 2005 à 16:07
NENNI pour le 'quiff-quiff', tests à refaire sur gros traitements et tu changeras d'avis.

ciao...
BruNews, MVP VC++
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
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.



a+
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 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)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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).
0
Rejoignez-nous