Я понимаю мотивацию использования std:: string_view;
это может помочь избежать ненужных распределений в аргументах функции.
Например:
Следующая программа создаст std::string
из строкового литерала.
Это вызывает нежелательное динамическое распределение, так как нас интересует только наблюдение за символами.
#include <iostream>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::string const& str){}
int main(){
observe_string("hello world"); //prints [allocating 36 bytes]
}
Использование string_view
решит проблему:
#include <iostream>
#include <experimental/string_view>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::experimental::string_view const& str){
}
int main(){
observe_string("hello world"); //prints nothing
}
Это оставляет мне вопрос.
Когда я выберу std::string функцией const & вместо string_view для аргументов функции?
Глядя на интерфейс std::string_view
, похоже, что я могу заменить все экземпляры std::string
, которые передаются const&
. Есть ли какие-либо встречные примеры? Является ли std::string_view
заменой std::string const&
для передачи параметров?