Seperti halnya saya suka C dan C ++, saya tidak bisa tidak menggaruk-garuk kepala saya pada pilihan string yang diakhiri null:
- String awalan panjang (yaitu Pascal) ada sebelum C
- String awalan panjang membuat beberapa algoritma lebih cepat dengan memungkinkan pencarian panjang waktu konstan.
- String awalan panjang membuatnya lebih sulit untuk menyebabkan kesalahan buffer overrun.
- Bahkan pada mesin 32 bit, jika Anda membiarkan string menjadi ukuran memori yang tersedia, string awalan panjang hanya tiga byte lebih lebar dari string yang diakhiri null. Pada mesin 16 bit ini adalah satu byte. Pada mesin 64 bit, 4GB adalah batas panjang string yang masuk akal, tetapi bahkan jika Anda ingin memperluasnya ke ukuran kata mesin, mesin 64 bit biasanya memiliki memori yang cukup membuat tambahan tujuh byte byte semacam argumen nol. Saya tahu standar C asli ditulis untuk mesin yang sangat buruk (dalam hal memori), tetapi argumen efisiensi tidak menjual saya di sini.
- Hampir semua bahasa lainnya (yaitu Perl, Pascal, Python, Java, C #, dll) menggunakan string awalan panjang. Bahasa-bahasa ini biasanya mengalahkan C dalam benchmark manipulasi string karena mereka lebih efisien dengan string.
- C ++ memperbaikinya sedikit dengan
std::basic_string
templat, tetapi array karakter biasa yang mengharapkan string yang diakhiri null masih menyebar. Ini juga tidak sempurna karena membutuhkan alokasi tumpukan. - String yang diakhiri Null harus mencadangkan karakter (yaitu, null), yang tidak dapat ada dalam string, sementara string awalan panjang dapat berisi embedded nulls.
Beberapa dari hal-hal ini muncul lebih baru daripada C, jadi masuk akal bagi C untuk tidak mengetahuinya. Namun, beberapa jelas sebelum C terjadi. Mengapa string null yang diakhiri telah dipilih alih-alih awalan panjang yang jelas superior?
EDIT : Karena beberapa meminta fakta (dan tidak suka yang sudah saya berikan) pada poin efisiensi saya di atas, mereka berasal dari beberapa hal:
- Concat menggunakan null terminated string membutuhkan O (n + m) kompleksitas waktu. Awalan panjang seringkali hanya membutuhkan O (m).
- Panjang menggunakan string terminasi nol membutuhkan O (n) kompleksitas waktu. Panjang awalannya adalah O (1).
- Panjang dan concat sejauh ini merupakan operasi string yang paling umum. Ada beberapa kasus di mana string null yang diakhiri dapat lebih efisien, tetapi ini terjadi jauh lebih jarang.
Dari jawaban di bawah, ini adalah beberapa kasus di mana string null yang diakhiri lebih efisien:
- Ketika Anda harus memotong awal string dan harus meneruskannya ke beberapa metode. Anda tidak dapat benar-benar melakukan ini dalam waktu yang konstan dengan awalan panjang bahkan jika Anda diizinkan untuk menghancurkan string asli, karena awalan panjang mungkin perlu mengikuti aturan penyelarasan.
- Dalam beberapa kasus di mana Anda hanya mengulang-ulang karakter string dengan karakter Anda mungkin dapat menyimpan register CPU. Perhatikan bahwa ini hanya berfungsi jika Anda belum mengalokasikan string secara dinamis (Karena itu Anda harus membebaskannya, mengharuskan menggunakan register CPU yang Anda simpan untuk memegang pointer yang Anda dapatkan dari malloc dan teman-teman).
Tak satu pun dari yang di atas hampir umum seperti panjang dan concat.
Ada satu lagi yang ditegaskan dalam jawaban di bawah ini:
- Anda harus memotong ujung tali
tapi yang ini salah - jumlah waktu yang sama untuk string yang diakhiri nol dan panjang awalan. (String diakhiri Null hanya menempel nol di mana Anda ingin akhir baru menjadi, awalan panjang hanya mengurangi dari awalan.)