Quando você precisa de uma sequência terminada nula em um cenário somente leitura?

10

Venho brincando com a std::string_viewbiblioteca e estou pensando em mudar uma base de código em que tenho trabalhado para usar std::string_viewo máximo possível. No entanto, em muitos dos tópicos que li sobre o assunto de quando e onde usar em std::string_viewvez de const std::string &. Eu já vi muitas respostas dizerem: "Quando você não precisa de uma sequência terminada nula". Então, quando comecei a pesquisar na web, "quando você precisa de uma string terminada nula?" Eu realmente não encontrei nenhuma resposta útil sobre o assunto.

Posso pensar em um exemplo de uma biblioteca externa à qual você vinculará que requer a std::string. E, nesse caso, você precisaria de uma sequência terminada nula, pois essa biblioteca exige. Eu acho que outro exemplo seria se você precisasse modificar a string em si, mas não passaríamos const &se precisássemos modificá-la.

Então, quando você precisaria usar uma string terminada nula?

Links que eu procurei:

  1. Como exatamente std :: string_view é mais rápido que const std :: string &?
  2. Quando eu passaria const & std :: string em vez de std :: string_view?
  3. Por que apenas exibição em cadeia?
  4. Existe sentido em usar const std :: string & argumentos no C ++ 17?
Sailanarmo
fonte
5
Para interagir com APIs C, principalmente.
Walnut
@uneven_mark você pode dar um exemplo de um?
22719 Sailanarmo
A resposta aceita para a quarta pergunta que você vincula parece que responde a essa pergunta.
François Andrieux
11
@Sailanarmo A maioria das funções, por exemplo, POSIX ou qualquer outra biblioteca C que está usando um const char*argumento. a resposta de eerorika tem um exemplo.
Walnut
11
@ FrançoisAndrieux, então a resposta é: "Desde que a API não exija uma string terminada nula?"
Sailanarmo 22/11/19

Respostas:

10

Quando você precisa de uma sequência terminada nula?

Você precisa de uma sequência terminada nula sempre que a API usada indicar que você precisa. Esse requisito é onipresente nas interfaces C e não é explicitamente declarado em alguma documentação. Se um argumento de função é umchar* (possivelmente const) e não existe um argumento de comprimento, você deve assumir o requisito, a menos que a documentação diga o contrário.

Vamos pegar a função execve(do padrão POSIX) como um exemplo:

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

Se você passar um argumento terminado não nulo como pathname, o comportamento do seu programa será indefinido.

eerorika
fonte
Então, neste caso, o nome do caminho, seria um std::string, seria executado como execve(pathname.c_str(),...,...)?
Sailanarmo 22/11/19
6

É realmente muito fácil de saber. Se você estiver chamando uma função que usa apenas uma string c ( char*/ const char*), precisará de uma string terminada nula, pois essa é a única maneira de saber onde fica o final da string.

Se você possui uma função que ocupa um char*/ const char*mais o tamanho, ou apenas dois ponteiros marcam o início e o fim dos dados, não precisa de uma sequência terminada nula, pois possui / pode obter o tamanho da sequência sem iterar para um terminador nulo.

NathanOliver
fonte