endereço strings constantes
-
05-07-2019 - |
Pergunta
Eu tenho várias constantes de cadeia idênticos no meu programa:
const char* Ok()
{
return "Ok";
}
int main()
{
const char* ok = "Ok";
}
Existe garantia de que eles estão com o mesmo endereço, ou seja, eu poderia escrever o seguinte código? Ouvi dizer que GNU C ++ cordas otimizar para que eles tenham o mesmo endereço, eu poderia usar esse recurso em meus programas?
int main()
{
const char* ok = "Ok";
if ( ok == Ok() ) // is it ok?
;
}
Solução
Não há dúvida nenhuma garantia, mas é um comum (eu acho) otimização.
O padrão C ++ diz (2.13.4 / 2 "literais String):
Se todas as strings literais são distintas (isto é, são armazenados em objetos não sobrepostas) é definido pela implementação.
Para ser claro, você deve código não escrita que assume essa otimização terá lugar -. Como Chris Lutz diz código, C ++ que depende este é o código que está esperando para ser quebrado
Outras dicas
isso é chamado corda internar
No seu caso não é melhor contar com isso. Os âmbitos são diferentes, mas eu não me acho muito competente neste assunto
GCC usa essa otimização, e Microsoft não (eles chamam corda pooling ). É apenas otimização, C ++ Padrão afirma explicitamente que você não pode usar isso (em 2.13.4 / 2). Além disso, basta imaginar que você vai ter ponteiro para seqüência de algum outro módulo / biblioteca -. Eu não acho que o compilador poderia fazer essa otimização nesse caso
Existe garantia de que eles estão com o mesmo endereço, ou seja, eu poderia escrever o seguinte código?
A norma permite que tais otimizações desde strings literais são somente leitura.
Ouvi dizer que GNU C ++ cordas otimizar para que eles tenham o mesmo endereço, eu poderia usar esse recurso em meus programas?
Sim, GCC / G ++ costumam fazer isso. AFAIK, há uma opção para transformar este on / off.
Não existe tal garantia. A linguagem apenas diz que eles pode tem o mesmo endereço. Ou talvez não.
Na verdade, não é uma solução, uma solução tão simples:
char const * const Message_Ok = "OK";
char const * const OK() { return Message_Ok; }
int main(int argc, const char* argv[])
{
if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
return 0;
}
Você não pode comparar dois strings literais diferentes, mas usar uma variável global const para transmitir a sua significado e é OK
para comparar o endereço de memória:)
Alguns externa pode estar faltando ... Eu tenho alguma dificuldade com essa besta ??em>