Я вижу два 'some'
литерала в коде ассемблера, сгенерированном MSVC, но только один с clang и gcc. Это приводит к совершенно другим результатам выполнения кода.
static const char *A = "some";
static const char *B = "some";
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
Может ли кто-нибудь объяснить разницу и сходство между этими результатами компиляции? Почему clang / gcc что-то оптимизирует, даже если оптимизации не требуется? Это какое-то неопределенное поведение?
Я также заметил, что если я изменю объявления на показанные ниже, clang / gcc / msvc вообще не оставит ничего "some"
в коде ассемблера. Почему поведение отличается?
static const char A[] = "some";
static const char B[] = "some";