Widzę dwa 'some'
literały w kodzie asemblera wygenerowanym przez MSVC, ale tylko jeden z clang i gcc. Prowadzi to do zupełnie innych wyników wykonania kodu.
static const char *A = "some";
static const char *B = "some";
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
Czy ktoś może wyjaśnić różnicę i podobieństwa między tymi wynikami kompilacji? Dlaczego clang / gcc optymalizuje coś, nawet jeśli żadna optymalizacja nie jest wymagana? Czy to jakieś niezdefiniowane zachowanie?
Zauważyłem również, że jeśli zmienię deklaracje na te pokazane poniżej, clang / gcc / msvc w ogóle nie pozostawi żadnych "some"
w kodzie asemblera. Dlaczego zachowanie jest inne?
static const char A[] = "some";
static const char B[] = "some";