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?
  ;
}
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top