メモリ空間の割り当ては、(両方の) C と Java の長さのような文字列の操作にどのように影響しますか? (これは、C 文字列変数が 1 ワードあたり 4 バイトをパックするのに対し、Java 文字列変数は 1 ワードあたり 2 ハーフ ワードをパックするという事実に関連しています)
2 に答える
実際のところ、 C には C 文字列変数はありません。それらは単なる配列、つまり文字の配列です。Cの 1 つchar
が を占め1 byte
ます。文字列リテラルは文字の配列として格納され、最後に終端\0
が追加されます。
Java プログラミング言語では、文字列はオブジェクトです。String には以下が含まれます。
- 実際の文字を含むchar 配列— したがって、別個のオブジェクト — です。
- 文字列が始まる配列への整数オフセット。文字列の長さ;
- ハッシュコードのキャッシュされた計算のための別の int 。
これは、文字列に文字が含まれていない場合でも、char 配列参照に 4 バイト、さらに 3 つの int フィールドに 3*4=12 バイト、さらにオブジェクト ヘッダーに 8 バイトが必要であることを意味します。これにより、24 バイトが得られます (これは 8 の倍数であるため、これまでのところ「パディング」バイトは必要ありません)。次に、(空の) char 配列には、さらに 12 バイトが必要になります (配列には、長さを格納するために余分な 4 バイトがあります)。この場合、char 配列オブジェクトによって使用されるメモリを最大で16. つまり、空の文字列は合計 40 バイトを使用します。
文字列によるメモリ使用量を計算するには、配列内の文字が 2 バイトであるという事実を考慮する必要があります。
JAVA->String.length()
は、Java 文字列クラスが長さをフィールドとして格納するため、文字列に含まれる文字数を一定時間操作します。
C-> 文字列の長さを計算するために、そのランタイムが文字列のサイズとともに大きくなるstrlen()
まで、配列全体をトラバースします。\0
AC 文字列は、nul
バイトで終了する一連のバイトです。
Java String は、既知の長さを持ち、16 ビットの配列を参照するオブジェクトです。chars
String のメモリ割り当てははるかに高くなりますが、UTF-16 文字と O(1) 長さ操作がサポートされています。つまり、場合によっては高速になる可能性があります。