web-dev-qa-db-fra.com

Meilleure façon d'obtenir la longueur de const char * en c ++

je connais deux façons d'obtenir la longueur de const char *

const char * str = "Hello World !";
int Size = 0;
while (str[Size] != '\0') Size++;

et l'autre manière est très simple

const char * str = "Hello World !";
size_t Size = strlen(str);

mais je ne veux pas utiliser les fonctions str lib comme strlen et je pense que cette fonction utilise aussi mon premier comportement. parce que dans le monde du PC, lorsque nous voulons compter quelque chose, nous devons compter chaque bloc et qu'il n'y a pas de magie pour obtenir la longueur en un seul mouvement, donc je pense que la première façon est la meilleure option pour obtenir la longueur de const char *. autrement je pense que la première façon est peut-être trop lourde pour les cordes lourdes. donc je suis confus. quelle voie est meilleure et pourquoi l'autre n'est pas?

6
JamesAlb

Inspectons la liste Assembly de ces deux méthodes.

#include <cstddef>
#include <cstring>

int string_size_1()
{
    const char * str = "Hello World !";
    int Size = 0;
    while (str[Size] != '\0') Size++;
    return Size;
}

int string_size_2()
{
    const char * str = "Hello World !";
    size_t Size = strlen(str);
    return Size;
}

Utilisation de Clang 4.0.0 avec des drapeaux -std=c++14 -O2

string_size_1():                     # @string_size_1()
        mov     eax, 13
        ret

string_size_2():                     # @string_size_2()
        mov     eax, 13
        ret

Lien: https://godbolt.org/g/5S6VSZ

Les deux méthodes aboutissent exactement à la même liste d'assemblys. En outre, le compilateur optimise tout et renvoie simplement une constante car le littéral de chaîne est connu lors de la compilation. Donc, en termes de performances, ils sont tout aussi bons.

Mais en termes de lisibilité, strlen(str) est définitivement mieux. Un appel de fonction indique l'intention via le nom de la fonction. Une boucle ne peut pas faire ça.


En outre, std::string Et std::string_view Sont plus préférables que la chaîne C dans de nombreux cas. Considérez-les.

16
user2486888

Dans ce cas, la réponse est connue au moment de la compilation:

template <std::size_t S>
constexpr std::size_t string_length
(
    char const (&)[S]
)
{
    return S - 1;
}

usage:

std::cout << string_length("example") << std::endl;

Pour les cas où la chaîne n'est pas une constante de temps de compilation, utilisez strlen si seul le pointeur vers la chaîne est disponible, std :: distance si les deux pointeurs vers le début et la fin sont disponibles, ou .size () si vous traitez avec un std: :chaîne

1
Michael Maniscalco