เหตุใด (เฉพาะ) คอมไพเลอร์บางตัวจึงใช้แอดเดรสเดียวกันสำหรับตัวอักษรสตริงที่เหมือนกัน
https://godbolt.org/z/cyBiWY ฉันเห็น'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 …