Я вижу два '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";