翻譯單元中的字串文字:相同記憶體位址的可靠性
字串文字通常在程式語言中使用。但是依賴在不同翻譯單元中具有相同記憶體位址的相同字串文字可靠嗎?
記憶體位址一致性的可移植性
根據C99 和C標準草案中,未指定具有相同值的字串文字是否具有不同的記憶體位址的行為。這意味著不同的實作可能會以不同的方式處理此問題。
雖然某些編譯器和平台可能提供字串文字池選項,例如 GCC 的 -fmerge-constants,但這不是一個保證的功能,並且可能因係統而異。
翻譯單元內的可靠性
在同一翻譯單元(即單一來源檔案)內,字串文字通常會合併並儲存在單一位置以優化內存使用。但是,此行為是特定於實現的,不能依賴可移植性。
範例程式碼
請考慮提供的範例程式碼:
// foo.c const char *x = "I'm a literal!"; // bar.c const char *y = "I'm a literal!"; // test.c extern const char *x; extern const char *y; assert(x == y);
在這種情況下,如果編譯器不跨翻譯單元執行字串文字池或特定平台不支持,則斷言x == y 將失敗。
結論
依賴於跨翻譯單元具有相同記憶體位址的相同字串文字是不可移植的,並且可能導致不可預測的行為。然而,在單一翻譯單元內,通常出於最佳化目的而合併字串文字。請務必查閱編譯器文件以了解每種情況下的特定行為,並在必要時使用適當的措施。
以上是相同的字串文字在翻譯單元中是否有相同的記憶體位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!