Когда вам нужна строка с завершающим нулем в сценарии только для чтения?

Я экспериментировал с библиотекой std::string_view и подумывал об изменении кодовая база, над которой я работал, чтобы максимально использовать std::string_view. Однако во многих темах, которые я читал, обсуждалось, когда и где использовать std::string_view вместо const std::string &. Я видел много ответов, говорящих: «Когда вам не нужна строка с нулевым завершением». Итак, когда я начал искать в Интернете, «когда вам нужна строка с завершающим нулем?» Я действительно не встречал каких-либо полезных ответов по этому вопросу.

Я могу придумать пример внешней библиотеки, на которую вы ссылаетесь, для которой требуется файл std::string. И в этом случае вам понадобится строка с нулевым завершением, так как эта библиотека требует этого. Я предполагаю, что другим примером может быть, если вам нужно изменить саму строку, но тогда мы бы не передали ее const &, если бы нам нужно было ее изменить.

Итак, когда вам нужно использовать строку с нулевым завершением?

Ссылки, которые я смотрел:

  1. Как именно std::string_view быстрее, чем const std::string& ?
  2. Когда мне передать const& std::string вместо std ::string_view?
  3. Почему отображается только строка?
  4. Есть ли смысл использовать const Аргументы std::string& в С++ 17?

person Sailanarmo    schedule 22.11.2019    source источник
comment
В основном для взаимодействия с C API.   -  person walnut    schedule 22.11.2019
comment
@uneven_mark, можете ли вы привести пример?   -  person Sailanarmo    schedule 22.11.2019
comment
Принятый ответ на четвертый вопрос, на который вы ссылаетесь, кажется, отвечает на этот вопрос.   -  person François Andrieux    schedule 22.11.2019
comment
@Sailanarmo Большинство функций, например. POSIX или любая другая библиотека C, принимающая аргумент const char*. В ответе ээрорики есть пример.   -  person walnut    schedule 22.11.2019
comment
@FrançoisAndrieux, так что на самом деле ответ таков: пока API не вызывает строку с нулевым завершением?   -  person Sailanarmo    schedule 22.11.2019
comment
Было бы ошибкой стандартизировать string_view. Вы не знаете, когда в будущем вам понадобится общаться с внешним интерфейсом. Если это произойдет, вам придется сделать копию строки, которая сведет на нет все предполагаемые улучшения производительности.   -  person Richard Hodges    schedule 25.11.2019


Ответы (2)


Когда вам нужна строка с завершающим нулем?

Вам нужна строка с завершающим нулем всякий раз, когда используемый вами API говорит, что вам это нужно. Это требование распространено в интерфейсах C и не указано явно в некоторых документах. Если аргумент функции является char* (возможно, константным) и нет аргумента длины, вы должны принять требование, если в документации не указано иное.

Возьмем в качестве примера функцию execve (из стандарта POSIX):

int execve(const char *pathname, char *const argv[], char *const envp[]);

Если вы передадите ненулевой завершающий аргумент как pathname, то поведение вашей программы будет неопределенным.

person eerorika    schedule 22.11.2019
comment
Таким образом, в этом случае путь, будь он std::string, выполнялся бы как execve(pathname.c_str(),...,...)? - person Sailanarmo; 22.11.2019

На самом деле это довольно легко узнать. Если вы вызываете функцию, которая просто принимает c-строку (char*/const char*), вам нужна строка с нулевым завершением, поскольку это единственный способ узнать, где находится конец строки.

Если вместо этого у вас есть функция, которая принимает char*/const char* плюс размер или просто два указателя, отмечающие начало и конец данных, тогда вам не нужна строка с нулевым завершением, поскольку вы имеете/можете получить размер строки без повторения к нулевому терминатору.

person NathanOliver    schedule 22.11.2019