ホームページ  >  記事  >  バックエンド開発  >  同じ内容の文字列リテラルは、異なる変換単位でも同じアドレスを持つことが保証されますか?

同じ内容の文字列リテラルは、異なる変換単位でも同じアドレスを持つことが保証されますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 04:30:02863ブラウズ

Are String Literals with the Same Content Guaranteed to Have the Same Address in Different Translation Units?

変換単位間の文字列リテラル アドレスの一貫性

質問:

と仮定することは信頼できますか同じ内容の文字列リテラルは、異なる翻訳単位 (異なるソース ファイルなど) にわたって同じメモリ アドレスを持ちますか?

答え:

いいえ、文字列に依存します。翻訳単位間で一貫性のあるリテラル アドレスは移植性がなく、未指定の動作とみなされます。

C および C 標準では、同じ内容の文字列リテラルが別個のメモリ位置を占有するかどうかは実装定義であると規定されています。これは、コンパイラやランタイム環境が異なると文字列リテラルの処理方法が異なり、文字列リテラルにさまざまなメモリ アドレスが割り当てられる可能性があることを意味します。

影響:

  • 同じ内容を持つ 2 つの文字列リテラルが翻訳単位間で同じアドレスを持つ場合、一部のコンパイラまたはプラットフォームではアサーションが失敗する可能性があります。
  • 比較やその他の操作で文字列リテラル アドレスに依存するコードは、予期しない動作を示す可能性があります。

オプション:

同じ翻訳単位 (つまり、単一のソース ファイル) 内で一貫した文字列リテラル アドレスが必要な場合、一部のコンパイラは次のようなオプションを提供します。

  • GCC: -fmerge-constants は、文字列リテラルを含む同一の定数をマージします。
  • Visual Studio: /GF は、文字列リテラルのプーリングを有効にします。

注:

  • 変換単位間の文字列リテラル アドレスの一貫性は保証されていないため、信頼すべきではありません。
  • 単位間の文字列リテラルの一貫性が重要な場合は、次のことを考慮してください。共有ヘッダー ファイルを使用するか、翻訳単位間で文字列値を明示的に渡します。

以上が同じ内容の文字列リテラルは、異なる変換単位でも同じアドレスを持つことが保証されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。