たとえばJavaやC++の場合、メモリは文字列にどのように割り当てられますか?これはばかげているかもしれませんので、すみません。文字列のサイズが不明なため、疑問に思います。
6 に答える
Javaでは、String
は不変オブジェクトであるため、割り当て時にの「サイズ」を知る必要がありますString
。「静的」な場合は共有オブジェクトプールに割り当てられ(たとえばString
、のような文字列"Hey, I'm a String litteral!"
)、を使用して構築された場合はヒープに割り当てられますnew String(...)
。
Java文字列は不変のオブジェクトです。ある意味で、文字列を作成するたびに、文字列内の文字数で割り当てられたchar[]メモリがあります。その文字列に対して何らかの操作を行うと、それはまったく新しいオブジェクトになり、charの長さでメモリ割り当てが行われます。
内部的には、JavaString
は既知の長さのchar配列にすぎません。Stringのクラスメンバーは次のとおりです。
110 public final class String
111 implements java.io.Serializable, Comparable<String>, CharSequence
112 {
113 /** The value is used for character storage. */
114 private final char value[];
115
116 /** The offset is the first index of the storage that is used. */
117 private final int offset;
118
119 /** The count is the number of characters in the String. */
120 private final int count;
121
122 /** Cache the hash code for the string */
123 private int hash; // Default to 0
124
125 /** use serialVersionUID from JDK 1.0.2 for interoperability */
126 private static final long serialVersionUID = -6849794470754667710L;
...
ベクトルのように動的に割り当てられます。大きくなりすぎると、内部メソッド(C ++)によって自動的にサイズ変更されます。Javaでは、thinksteepがすでに述べたように、文字列は不変です。
可変サイズと不明なサイズを混同します。どの言語の具体的な文字列も常に既知のサイズであり、文字列の各インスタンスのサイズが異なる場合があります。言語が可変長を処理する方法は大きく異なる可能性があり、実装によって異なります。
以前の回答に追加するだけです。
Javaでは、文字列の作成方法に応じて、2つの方法で文字列を割り当てることができます。たとえば、文字列がString s = "some string";
JVMで作成された場合、この文字列はいわゆるリテラルプール(メモリに問題があったときに残されたもの)に配置され、 String s = new String("some string");
JVMで文字列を作成した場合、これはヒープに配置されます...
唯一の重要な違いは、文字列が両方ともリテラルプールにある場合は、operator ==を使用して文字列を比較しますが、これは推奨されません。
よろしく