C ve C ++ 'ı sevdiğim kadarıyla, boş sonlandırılmış dizelerin seçiminde başımı çizemiyorum:
- Önceden eklenmiş uzunluk (yani Pascal) dizeleri C'den önce vardı
- Uzunluk ön ekli dizeler, sabit süre uzunluğu aramasına izin vererek birkaç algoritmayı daha hızlı hale getirir.
- Uzunluk ön ekli dizeler, arabellek taşması hatalarına neden olmayı zorlaştırır.
- 32 bitlik bir makinede bile, dizenin kullanılabilir belleğin boyutu olmasına izin verirseniz, uzunluk ön ekli dize, boş bir sonlandırılmış dizeden yalnızca üç bayt daha geniştir. 16 bitlik makinelerde bu tek bir bayttır. 64 bitlik makinelerde, 4GB makul bir dize uzunluğu sınırıdır, ancak makine sözcüğünün boyutuna genişletmek isteseniz bile, 64 bitlik makineler genellikle fazladan yedi baytlık null argüman yapan geniş bir belleğe sahiptir. Orijinal C standardının inanılmaz derecede zayıf makineler için (bellek açısından) yazıldığını biliyorum, ancak verimlilik argümanı beni burada satmıyor.
- Diğer tüm diller (ör. Perl, Pascal, Python, Java, C #, vb.) Uzunluk ön ekli dizeler kullanır. Bu diller genellikle string manipülasyon kriterlerinde C'yi geçerler çünkü stringlerle daha verimlidirler.
- C ++ bunu
std::basic_string
şablonla biraz düzeltti , ancak boş sonlandırılmış dizeler bekleyen düz karakter dizileri hala yaygın. Bu aynı zamanda kusurludur, çünkü yığın tahsisi gerektirir. - Boş sonlandırılmış dizeler, dizede bulunmayan bir karakter (yani null) ayırmalıdır; uzunluk ön ekli dizeler katıştırılmış boş değerler içerebilir.
Bunların birçoğu C'den daha yakın bir zamanda ortaya çıktı, bu yüzden C'nin onları bilmemesi mantıklı olurdu. Ancak, birkaç kişi C gelmeden çok açıktı. Açıkça üstün uzunluklu önek yerine null sonlandırılmış dizeler neden seçilsin ki?
EDIT : Bazıları yukarıdaki verimlilik noktamda gerçekler istediğinden (ve zaten sağladığımları beğenmediğinden), birkaç şeyden kaynaklanıyor:
- Boş sonlandırılmış dizeler kullanılarak yapılan concat, O (n + m) zaman karmaşıklığı gerektirir. Uzunluk ön eki genellikle yalnızca O (m) gerektirir.
- Boş sonlandırılmış dizeler kullanan uzunluk O (n) zaman karmaşıklığı gerektirir. Uzunluk ön eki O (1) 'dir.
- Uzunluk ve concat açık ara en yaygın dize işlemleri. Boş sonlandırılmış dizelerin daha verimli olabileceği birkaç durum vardır, ancak bunlar çok daha az sıklıkla görülür.
Aşağıdaki yanıtlardan, boş sonlandırılmış dizelerin daha verimli olduğu bazı durumlar şunlardır:
- Bir dizenin başlangıcını kesmeniz ve bir yönteme geçirmeniz gerektiğinde. Orijinal dizeyi yok etmenize izin verilse bile, bunu uzunluk önekiyle sabit bir zamanda yapamazsınız, çünkü uzunluk önekinin hizalama kurallarına uyması gerekir.
- Bazı karakterleri karakter dizisine göre döngüye soktuğunuz durumlarda, bir CPU kaydını kaydedebilirsiniz. Bunun yalnızca dizeyi dinamik olarak ayırmamış olmanız durumunda işe yaradığını unutmayın (Çünkü o zaman serbest bırakmak zorunda kalacaksınız, çünkü malloc ve arkadaşlardan aldığınız işaretçiyi tutmak için kaydettiğiniz CPU kaydını kullanmanız gerekir).
Yukarıdakilerin hiçbiri uzunluk ve akrabalık kadar yaygın değildir.
Aşağıdaki cevaplarda bir iddia daha var:
- Dizenin sonunu kesmelisin
ancak bu yanlıştır - boş sonlandırılmış ve uzunluk ön ekli dizeler için aynı süre geçerlidir. (Boş sonlandırılmış dizeler, yeni sonun olmasını istediğiniz yere boş bir değer yapıştırır; uzunluk önekleri yalnızca önekten çıkarılır.)