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