」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C 和 C++ 中各個翻譯單元中字串文字的記憶體位址是否一致?

C 和 C++ 中各個翻譯單元中字串文字的記憶體位址是否一致?

發佈於2024-11-13
瀏覽:495

Is the Memory Address of a String Literal Consistent Across Translation Units in C and C  ?

跨翻譯單元的字串文字地址

在C 和C 語言中,程式設計師經常將字串文字用於各種目的。出現一個常見問題:假設不同翻譯單元中的相同字串文字將具有相同的記憶體位址是否可靠?

C/C 標準

C99 C 草案標準明確未指定該主題。 C99 標準草案第 6.4.5 節指出「如果這些陣列 [字串文字] 的元素具有適當的值,則它們是否不同是未指定的。」這表示編譯器可以自由決定是否池化字串文字。

編譯器實作

實際上,不同的編譯器對於字串文字池有不同的行為。

  • GCC: 使用 -fmerge-constants 支援跨編譯單元的字串文字池 旗幟。可以使用 -fno-merge-constants 停用此行為。
  • Visual Studio: 包含用於字串文字池的選項 (/GF)。
  • 其他編譯器: 可能支援也可能不支援字串文字池,而且它是

缺乏要求的理由

不要求在C 標準中匯集字串文字的理由是由於當時的編譯器和執行時間環境。一些實作將字串文字儲存在 ROM 中,而其他實作則將它們儲存在可寫入資料部分中。為了確保可移植性,最好不要強制執行任何特定行為。

實際注意事項

一般來說,依賴具有相同值的字串文字是不可移植的跨翻譯單元的記憶體位址。但是,在同一翻譯單元內,行為更有可能保持一致,因為編譯器對最佳化有更多控制。

結論

a 的記憶體位址字串文字是實作細節,不能依賴它在翻譯單元之間保持一致。重要的是要意識到這一事實並編寫獨立於此類實作細節的程式碼。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3