Saya telah bermain-main dengan std::string_view
perpustakaan dan saya telah memikirkan untuk mengubah basis kode yang telah saya coba untuk menggunakan std::string_view
sebanyak mungkin. Namun, di banyak thread yang saya telah membaca tentang masalah kapan dan di mana untuk menggunakan std::string_view
bukan const std::string &
. Saya telah melihat banyak jawaban mengatakan, "Ketika Anda tidak membutuhkan string yang diakhiri dengan nol." Jadi ketika saya mulai mencari di web, "kapan Anda membutuhkan string yang diakhiri?" Saya belum menemukan jawaban yang membantu tentang masalah ini.
Saya dapat memikirkan contoh perpustakaan eksternal yang akan Anda tautkan ke yang memerlukan a std::string
. Dan dalam hal ini Anda akan membutuhkan string yang diakhiri null karena perpustakaan itu mengharuskannya. Saya kira contoh lain adalah jika Anda perlu memodifikasi string itu sendiri, tetapi kemudian kita tidak akan melewatinya const &
jika kita perlu memodifikasinya.
Jadi kapan Anda perlu menggunakan string yang dihentikan nol?
Tautan yang telah saya lihat:
sumber
const char*
argumen eerorika's anwer memiliki contoh.Jawaban:
Anda memerlukan string yang dihentikan nol setiap kali API yang Anda gunakan mengatakan bahwa Anda membutuhkannya. Persyaratan ini ada di mana-mana dalam antarmuka C dan tidak secara eksplisit dinyatakan dalam beberapa dokumentasi. Jika argumen fungsi adalah
char*
(mungkin ke const), dan tidak ada argumen panjang, Anda harus mengasumsikan persyaratan kecuali dokumentasi mengatakan sebaliknya.Mari kita ambil fungsi
execve
(dari standar POSIX) sebagai contoh:Jika Anda memberikan argumen terminasi yang bukan nol
pathname
, maka perilaku program Anda akan tidak ditentukan.sumber
std::string
, akan dieksekusi sepertiexecve(pathname.c_str(),...,...)
?Sebenarnya cukup mudah untuk diketahui. Jika Anda memanggil fungsi yang hanya membutuhkan c-string (
char*
/const char*
), maka Anda memerlukan string yang diakhiri null karena itu adalah satu-satunya cara untuk mengetahui di mana kemudian ujung string.Jika Anda sebaliknya memiliki fungsi yang mengambil ukuran a
char*
/const char*
plus, atau hanya dua pointer menandai awal dan akhir data, maka Anda tidak perlu string diakhiri nol karena Anda memiliki / bisa mendapatkan ukuran string tanpa beralih ke iterasi terminator nol.sumber