Autant que j'aime le C et le C++, je ne peux pas m'empêcher de gratter ma tête sur le choix de la valeur null chaînes:
- Longueur de préfixe (c, Pascal) les chaînes de caractères existait avant C
- Longueur de préfixe de chaînes de faire plusieurs algorithmes plus rapides en permettant constante longueur de temps de recherche.
- Longueur de préfixe de chaînes de rendre plus difficile pour cause de dépassement de mémoire tampon d'erreurs.
- Même sur un ordinateur 32 bits, si vous laissez la chaîne à la taille de la mémoire disponible, une longueur de préfixe de la chaîne est à seulement trois octets plus large qu'une chaîne terminée par null. Sur 16 bits machines c'est un seul octet. Sur 64 bits machines, de 4 go est raisonnable chaîne de limite de longueur, mais même si vous voulez l'étendre à la taille de la machine word, 64 bits machines ont généralement beaucoup de mémoire en faisant l'appoint sept octets de tri d'un argument null. Je sais que l'original C standard a été écrit pour incroyablement machines pauvres (en termes de mémoire), mais l'efficacité d'un tel argument ne vend pas de moi ici.
- Presque tous les autres langue (c'est à dire Perl, Pascal, Python, Java, C#, etc) utiliser la longueur de préfixe de chaînes. Ces langues battre C de manipulation de chaîne de repères parce qu'ils sont plus efficaces avec des chaînes.
- C++ corrigé ce un peu avec l'
std::basic_string
modèle, mais de la plaine des tableaux de caractères attend les chaînes vides sont encore omniprésents. C'est aussi imparfaite, car elle nécessite l'allocation de tas. - Null chaînes ont pour réserver un personnage (à savoir, null), qui ne peut exister dans la chaîne, tandis que la longueur de préfixe de chaînes de caractères peuvent contenir des valeurs null incorporées.
Plusieurs de ces choses sont venus à la lumière, plus récemment, de C, de sorte qu'il serait judicieux pour les C de ne pas avoir connu d'entre eux. Cependant, plusieurs ont été clair bien avant C est venu pour être. Pourquoi les chaînes vides ont été choisi à la place de l', bien sûr, supérieure longueur de préfixe?
EDIT: Depuis que certains ont demandé des faits (et n'aime pas ceux que j'ai déjà fourni) sur mon point de rendement ci-dessus, il résulte que peu de choses:
- Concat à l'aide null chaînes nécessite O(n + m) temps de complexité. Longueur de préfixe ne requièrent souvent que O(m).
- Longueur à l'aide d'une valeur null chaînes nécessite O(n) le temps de la complexité. Longueur de préfixe est O(1).
- La longueur et la concat sont de loin les plus fréquentes opérations de la chaîne. Il y a plusieurs cas où la valeur null chaînes de caractères peuvent être plus efficaces, mais ils se produisent moins souvent.
À partir des réponses données ci-dessous, ce sont des cas où les chaînes vides sont plus efficaces:
- Lorsque vous avez besoin de couper le début d'une chaîne et de la nécessité de passer à une méthode. Vous ne pouvez pas vraiment faire en temps constant avec la longueur de préfixe, même si vous êtes autorisé à détruire la chaîne d'origine, parce que le préfixe de longueur a probablement besoin de suivre l'alignement des règles.
- Dans certains cas où vous êtes juste une boucle dans la chaîne de caractère par caractère, vous pourriez être en mesure d'enregistrer un PROCESSEUR inscrire. Notez que cela ne fonctionne que dans le cas que vous n'avez pas alloué dynamiquement la chaîne (Car alors vous auriez à le libérer, nécessitant de l'aide que le PROCESSEUR inscrire vous avez enregistré à l'maintenez le pointeur d'origine que vous avez obtenu à partir de malloc et amis).
Aucun des ci-dessus sont presque aussi commune que la longueur et la concat.
Il y a une plus affirmée dans les réponses ci-dessous:
- Vous avez besoin de couper la fin de la chaîne
mais celui-ci est incorrect, c'est la même quantité de temps pour valeur null et la longueur de préfixe de chaînes. (Null chaînes de caractères bâton null où vous souhaitez que la nouvelle fin, longueur prefixers juste soustraire à partir du préfixe.)