Autant que j'aime C et C ++, je ne peux pas m'empêcher de me gratter la tête au choix de chaînes terminées par null:
- Des chaînes de longueur préfixées (c'est-à-dire Pascal) existaient avant C
- Les chaînes préfixées par la longueur accélèrent plusieurs algorithmes en permettant une recherche de durée constante.
- Les chaînes préfixées par la longueur rendent plus difficile de provoquer des erreurs de dépassement de tampon.
- Même sur une machine 32 bits, si vous autorisez la chaîne à avoir la taille de la mémoire disponible, une chaîne préfixée de longueur n'est que de trois octets plus large qu'une chaîne terminée par null. Sur les machines 16 bits, il s'agit d'un seul octet. Sur les machines 64 bits, 4 Go est une limite de longueur de chaîne raisonnable, mais même si vous souhaitez l'étendre à la taille du mot machine, les machines 64 bits ont généralement suffisamment de mémoire, ce qui fait des sept octets supplémentaires une sorte d'argument nul. Je sais que la norme C d'origine a été écrite pour des machines incroyablement pauvres (en termes de mémoire), mais l'argument de l'efficacité ne me vend pas ici.
- Presque tous les autres langages (par exemple Perl, Pascal, Python, Java, C #, etc.) utilisent des chaînes de longueur préfixées. Ces langages battent généralement C dans les benchmarks de manipulation de chaînes car ils sont plus efficaces avec les chaînes.
- C ++ a rectifié cela un peu avec le
std::basic_string
modèle, mais les tableaux de caractères simples qui attendent des chaînes terminées par null sont toujours omniprésents. Ceci est également imparfait car il nécessite une allocation de tas. - Les chaînes terminées par Null doivent réserver un caractère (à savoir, null), qui ne peut pas exister dans la chaîne, tandis que les chaînes préfixées par la longueur peuvent contenir des null incorporés.
Plusieurs de ces choses sont apparues plus récemment que C, il serait donc logique que C ne les connaisse pas. Cependant, plusieurs étaient simples bien avant la naissance de C. Pourquoi des chaînes terminées nulles auraient-elles été choisies au lieu du préfixe de longueur évidemment supérieure?
EDIT : Puisque certains ont demandé des faits (et n'ont pas aimé ceux que j'ai déjà fournis) sur mon point d'efficacité ci-dessus, ils découlent de quelques choses:
- Concat utilisant des chaînes terminées nulles nécessite une complexité temporelle O (n + m). Le préfixe de longueur ne nécessite souvent que O (m).
- La longueur utilisant des chaînes terminées par null nécessite une complexité temporelle O (n). Le préfixe de longueur est O (1).
- La longueur et la concaténation sont de loin les opérations de chaîne les plus courantes. Il existe plusieurs cas où les chaînes terminées par null peuvent être plus efficaces, mais elles se produisent beaucoup moins souvent.
D'après les réponses ci-dessous, voici quelques cas où les chaînes terminées par null sont plus efficaces:
- Lorsque vous devez couper le début d'une chaîne et le transmettre à une méthode. Vous ne pouvez pas vraiment le faire en temps constant avec le préfixe de longueur même si vous êtes autorisé à détruire la chaîne d'origine, car le préfixe de longueur doit probablement suivre les règles d'alignement.
- Dans certains cas, lorsque vous parcourez simplement la chaîne caractère par caractère, vous pourrez peut-être enregistrer un registre CPU. Notez que cela ne fonctionne que dans le cas où vous n'avez pas alloué dynamiquement la chaîne (car alors vous devriez la libérer, ce qui nécessite d'utiliser ce registre CPU que vous avez enregistré pour contenir le pointeur que vous avez initialement reçu de malloc et de ses amis).
Rien de ce qui précède n'est presque aussi commun que la longueur et le concat.
Il y en a un de plus affirmé dans les réponses ci-dessous:
- Vous devez couper la fin de la chaîne
mais celui-ci est incorrect - c'est le même laps de temps pour les chaînes terminées par null et préfixées par la longueur. (Les chaînes terminées par des valeurs nulles collent simplement une valeur nulle où vous voulez que la nouvelle fin soit, les préfixes de longueur soustraient simplement le préfixe.)