翻訳単位の文字列リテラル: 同一のメモリ アドレスの信頼性
文字列リテラルは、プログラミング言語で一般的に使用されます。しかし、異なる変換単位で同じメモリ アドレスを持つ同じ文字列リテラルに依存することは信頼できますか?
メモリ アドレスの一貫性の移植性
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);
この場合、コンパイラが翻訳単位間で文字列リテラルのプーリングを実行しない場合、または特定のプラットフォームはそれをサポートしていません。
結論
翻訳単位間で同じメモリ アドレスを持つ同一の文字列リテラルに依存することは移植性がなく、予測できない動作を引き起こす可能性があります。ただし、単一の翻訳単位内では、通常、文字列リテラルは最適化の目的でマージされます。コンパイラのドキュメントを参照して、それぞれのケースにおける特定の動作を理解し、必要に応じて適切な措置を講じることが重要です。
以上が同一の文字列リテラルは、翻訳単位間で同じメモリ アドレスを持ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。