35 votes

Efficacité de la chaîne C par rapport aux chaînes C ++

C ++ Primer dit

Pour la plupart des applications, en plus d'être plus sûr, il est également plus efficace d'utiliser des chaînes de bibliothèque plutôt que des chaînes de style C

La sécurité est comprise. Pourquoi la bibliothèque de chaînes C ++ est-elle plus efficace? Après tout, en dessous de tout cela, les chaînes ne sont-elles pas toujours représentées comme des tableaux de caractères?

Pour clarifier, l'auteur parle-t-il de l'efficacité du programmeur (comprise) ou de l'efficacité du traitement?

26voto

Leonid Volnitsky Points 3927

C-string généralement plus rapides, car ils ne font pas appel de malloc/nouveau. Mais il y a des cas où l' std::string est plus rapide. La fonction strlen() O(N), mais std::string::size() O(1).

Aussi lors de la recherche de sous-chaîne, dans le c-string, vous devez vérifier pour '\0' sur chaque cycle, en std::string - vous ne le faites pas. Naïve de l'algorithme de recherche de sous-chaîne, il n'a pas beaucoup d'importance, car au lieu de vérifier '\0' , vous devez vérifier pour i<s.size(). Mais moderne et de haute performance des algorithmes de recherche de sous-chaîne traverse chaîne multi-octets étapes. Et la nécessité d' '\0' vérifier dans chaque octet ralentit. C'est la raison pour laquelle la GLIBC memmem x2 fois plus rapide que l' strstr. J'ai fait beaucoup de l'analyse comparative des algorithmes sous-chaîne.

Cela est vrai non seulement pour l'algorithme de recherche de sous-chaîne. Beaucoup d'autres de la chaîne de traitement de l'algorithme sont plus lents à zéro des chaînes terminées.

25voto

Nawaz Points 148870

Pourquoi les chaînes C++ de la bibliothèque plus efficace? Après tout, en dessous de tout, ne sont pas des chaînes de toujours représentés comme des tableaux de caractères?

Parce que le code qui utilise char* ou char[] est plus susceptible d'être inefficent si pas écrit avec soin. Par exemple, avez-vous vu en boucle comme ceci:

char *get_data();

char const *s = get_data(); 

for(size_t i = 0 ; i < strlen(s) ; ++i) //Is it efficent loop? No.
{
   //do something
}

Est efficace? Pas de. Le temps de la complexité de l' strlen() est O(N), et de plus, c'est calculée à chaque itération, dans le code ci-dessus.

Maintenant, vous pouvez dire "je peux le faire efficace si je l'appelle, strlen() juste une fois.". Bien sûr, vous le pouvez. Mais vous avez à faire tout ce qui sorte de l'optimisation de vous-même et consciemment. Si vous avez manqué quelque chose, vous avez manqué de cycles CPU. Mais avec std::string, que l'optimisation se fait par la classe elle-même. Vous pouvez donc écrire ceci:

std::string get_data();

std::string const & s = get_data(); //avoid copy if you don't need  it

for(size_t i = 0 ; i < s.size() ; ++i) //Is it efficent loop? Yes.
{
   //do something
}

Est efficace? Oui. Le temps de la complexité de l' size() est O(1). Pas besoin de l'optimiser manuellement ce qui souvent rend le code moche et difficile à lire. Le code résultant avec std::string est presque toujours soigné et propre en comparaison à d' char*.

Notez aussi que l' std::string non seulement rend votre code efficace en termes de cycles de CPU, mais il augmente aussi le programmeur d'efficacité!

8voto

Jonathan Wakely Points 45593

Un std::string connaît sa longueur, ce qui permet de nombreuses opérations plus rapidement.

Par exemple, étant donné:

const char* c1 = "Hello, world!";
const char* c2 = "Hello, world plus dog!";
std::string s1 = c1;
std::string s2 = c2;

strlen(c1) plus lente que l' s1.length(). Pour les comparaisons, strcmp(c1, c2) est à comparer plusieurs caractères pour déterminer les chaînes ne sont pas égales, mais s1 == s2 pouvez dire les longueurs ne sont pas les mêmes et retournera false immédiatement.

D'autres opérations aussi l'avantage de savoir la longueur à l'avance, par exemple, strcat(buf, c1) a trouver le terminateur null en buf de trouver l'endroit où ajouter des données, mais s1 += s2 connaît la longueur de l' s1 déjà et pouvez ajouter de nouveaux personnages au bon endroit immédiatement.

Quand il s'agit de la gestion de la mémoire, std::string alloue de l'espace supplémentaire à chaque fois qu'il se développe, ce qui signifie que les futurs ajouter les opérations n'ont pas besoin de réaffecter.

7voto

John Calsbeek Points 19381

Il y sont , dans certains cas, une std::string pourrait battre un char[]. Par exemple, C-style chaînes n'ont généralement pas une longueur explicite passé autour-au lieu de cela, le NUL de terminaison implicitement définit la longueur.

Cela signifie qu'une boucle qui continuellement strcats sur char[] est en fait l'exécution O(n2) de travail, parce que chaque strcat a à traiter l'ensemble de la chaîne afin de déterminer le point d'insertion. En revanche, le seul travail que l' std::string besoins à effectuer pour concaténer à la fin d'une chaîne est de copier les nouveaux personnages (et, éventuellement, de réaffecter stockage-mais pour que la comparaison soit juste, vous devez connaître la taille maximale à l'avance et reserve() il).

3voto

Coding Mash Points 3076

Les chaînes de caractères sont des objets qui contiennent des tableaux de caractères à l'intérieur d'eux-mêmes avec leur taille et d'autres fonctionnalités.Il est préférable d'utiliser des chaînes de chaînes à la bibliothèque parce qu'ils vous sauver de l'allocation et la désallocation de la mémoire, la recherche de fuites de mémoire et d'autres pointeur de dangers. Mais comme les chaînes de caractères sont des objets, de sorte qu'ils prennent plus d'espace dans la mémoire.

Cstring sont simplement des tableaux de caractères. Ils DOIVENT être utilisés lorsque vous travaillez en temps réel; quand vous ne connaissez pas complètement au sujet de combien d'espace mémoire que vous avez dans la main. Si vous utilisez cstring, vous devez prendre soin pour l'allocation de mémoire, puis de copier les données via la fonction strcpy ou caractère par caractère, puis le libérer après son utilisation, etc,etc. Afin de mieux utiliser les chaînes à partir de la bibliothèque string si vous voulez éviter un tas de maux de tête.

Les chaînes de programme d'augmentation de l'efficacité, mais aussi de réduire l'efficacité du traitement(mais pas nécessairement). Vice versa est avec cstring

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: