SORU
11 Aralık 2010, CUMARTESİ


'boş gerekçesi ne sonlandırılmış dize?

C ve C sevdiğim kadar , ama kafamı çizik boş sonlandırılmış dize seçimine yardımcı olamam:

  • Uzunluk öneki (örneğin Pascal) dize C önce de vardı
  • Uzunluğu dizeleri çeşitli algoritmalar daha hızlı sabit süre ara vererek öneki.
  • Uzunluğu dizeleri daha zor arabellek taşması hataları neden yapmak öneki.
  • Eğer dize kullanılabilir hafıza boyutunu olmak için bile 32 bit bir makinede, uzunluk öneki bir dizesinin boş sonlandırılmış bir dize daha sadece üç bayt daha geniş. 16 bit makinelerde bu tek bir bayt. 64 bit makineler, 4GB olduğunu makul bir dize uzunluğu sınırı, ama bile istediğiniz genişletmek için boyutu makine kelimesi, 64 bit makineler genelde bol hafıza verme fazladan yedi bayt sıralama boş bir argüman. Orijinal C standart delicesine zavallı makineleri (bellek açısından) için yazıldığını biliyorum, ama verimlilik argümanı beni burada satmaz.
  • Hemen hemen her diğer dil (yani Perl, Pascal, Python, C#, vb, Java) uzunluk öneki dizeleri kullanın. Bu diller genellikle dizeleri ile daha etkili olduğu için dize işleme kriterler C yendi.
  • C std::basic_string şablon ile bu biraz düzeltmiş ama, basit karakter dizileri boş sonlandırılmış dize bekliyor hala yaygındır. Bu yığın ayırma gerektirir, çünkü aynı zamanda eksik.
  • Boş dizeleri uzunluk öneki dizeleri gömülü boşluk içerebilir ancak dize olamaz var olan bir karakter (yani, null, rezerv, gerek sonlandırıldı.

Bu işler çok C bunların bilinmiyor olması mantıklı olur o yüzden son zamanlarda C daha hafif geldi. Ancak, birkaç C gelmeden önce de düz idi. Neden boş sonlandırılmış dizeler belli ki üstün uzunluğu önek yerine seçilmiş olurdu?

EDİTBazı istedi berigerçekler(ve ben zaten sağlanan olanlar gibi değildi) benim verim noktası üstünde birkaç şeyden kaynaklanıyor:

  • Herhangi bir parametre boş sonlandırılmış dize kullanarak O(n m) zaman karmaşıklığı gerektirir. Uzunluğu önek genellikle sadece O(m) gerektirir.
  • Uzunluğu boş sonlandırılmış dize kullanarak(n) zaman karmaşıklığı gerektirir. Uzunluğu önek, O(1) ' dir.
  • Uzunluğu ve herhangi bir parametre farkla en yaygın string işlemleri. Boş sonlandırılmış dize daha verimli olabileceği bazı durumlar vardır, ama bu çok daha az görülür.

Cevap aşağıda, bu boş sonlandırılmış dize daha etkili olduğu bazı durumlar şunlardır:

  • Ve bazı yönteme geçmek için bir dize ihtiyaç başından kesmek gerekir. Gerçekten varsa uzunluğu önek muhtemelen uyum kuralları takip etmek gerekiyor çünkü özgün dize yok etmek için izin, varsa bile uzunluğu önek ile sürekli bunu yapamazsın.
  • Sadece karakter ile bir dize karakteri döngü gittiğini bazı durumlarda CPU bir kayıt kaydetmek mümkün olabilir. Unutmayın bu sadece çalışır durumda olan sen değil dinamik olarak atanan dize (Çünkü olacaktın ücretsiz, gerektiren kullanarak CPU kayıt kurtardın tutmak işaretçiyi aslında var malloc ve arkadaşları).

Yukarıdakilerin hiçbiri uzunluğu ve herhangi bir parametre kadar yaygındır.

Bir daha cevapları aşağıda iddia var:

  • Dizenin sonuna kesmeniz gerekir

ama bu bir boş sonlandırılmış ve uzunluk öneki dizeleri için zaman aynı miktarda bu yanlış. (Boş sonlandırılmış dize sadece yeni bir son olmasını istediğiniz, uzunluğu prefixers sadece önek çıkarmak boş bir sopa.)

CEVAP
11 Aralık 2010, CUMARTESİ


horse's mouth:

BCPL hiçbiri, B veya C destekler bu karakter veri şiddetle dil; her fazla dizeleri davranır ve tamsayılar vektörler gibi birkaç genel kurallar takviyeleri kuralları. Hem BCPL ve B dize adresini gösterir statik bir alan ile başlatıldı dize, dolu karakterler hücreler. BCPL, ilk bayt dolu karakter sayısını içerir string; B, Kont yok ve dizeleri tarafından sonlandırıldı Özel Karakter, B yazılmış *e. Bu değişiklik kısmen yapıldı uzunluğu sınırlamasını önlemek için bir dize holding kaynaklanan 8 - ya da 9-bit bir yuvaya ve sayısı kısmen sayısını korumak çünkü bizim deneyim, daha az görünüyordu bir sonlandırıcı kullanarak daha rahat.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cristina Landa

    Cristina Lan

    28 Ocak 2010
  • FamilyFeud

    FamilyFeud

    22 AĞUSTOS 2006
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006

İLGİLİ SORU / CEVAPLAR