Tôi có thể thấy hai 'some'
ký tự trong mã trình hợp dịch do MSVC tạo ra, nhưng chỉ có một ký tự với clang và gcc. Điều này dẫn đến kết quả thực thi mã hoàn toàn khác nhau.
static const char *A = "some";
static const char *B = "some";
void f() {
if (A == B) {
throw "Hello, string merging!";
}
}
Bất cứ ai có thể giải thích sự khác biệt và tương đồng giữa những đầu ra biên dịch? Tại sao clang / gcc tối ưu hóa thứ gì đó ngay cả khi không yêu cầu tối ưu hóa? Đây có phải là một số loại hành vi không xác định?
Tôi cũng nhận thấy rằng nếu tôi thay đổi các khai báo thành những khai báo được hiển thị bên dưới, clang / gcc / msvc hoàn toàn không để lại bất kỳ khai báo nào "some"
trong mã trình hợp dịch. Tại sao hành vi lại khác nhau?
static const char A[] = "some";
static const char B[] = "some";