タグ付けされた質問 「string-interning」


14
文字列リテラルで文字列のインターンメソッドを使用する必要がある場合
String#intern()によると、internメソッドは、文字列が文字列プールにある場合、文字列プールから文字列を返すことになっています。そうでない場合、新しい文字列オブジェクトが文字列プールに追加され、この文字列の参照が返されます。 だから私はこれを試しました: String s1 = "Rakesh"; String s2 = "Rakesh"; String s3 = "Rakesh".intern(); if ( s1 == s2 ){ System.out.println("s1 and s2 are same"); // 1. } if ( s1 == s3 ){ System.out.println("s1 and s3 are same" ); // 2. } s1 and s3 are sames3がインターンされたときに印刷され、s1 and s2 …

4
一部のコンパイラーが同一の文字列リテラルに同じアドレスを使用するのはなぜですか?
https://godbolt.org/z/cyBiWY 'some'MSVCによって生成されたアセンブラコードで2つのリテラルを確認できますが、clangとgccを使用するリテラルは1つだけです。これにより、コード実行の結果がまったく異なります。 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 const char A[] = "some"; static const char B[] = "some";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.