Posso ver dois 'some'
literais no código assembler gerado pelo MSVC, mas apenas um com clang e gcc. Isso leva a resultados totalmente diferentes de execução de código.
static const char *A = "some";
static const char *B = "some";
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
Alguém pode explicar a diferença e semelhanças entre essas saídas de compilação? Por que o clang / gcc otimiza algo mesmo quando nenhuma otimização é solicitada? É algum tipo de comportamento indefinido?
Também noto que, se eu alterar as declarações para as mostradas abaixo, clang / gcc / msvc não deixará nenhuma "some"
no código do assembler. Por que o comportamento é diferente?
static const char A[] = "some";
static const char B[] = "some";