3

メモリ空間の割り当ては、(両方の) C と Java の長さのような文字列の操作にどのように影響しますか? (これは、C 文字列変数が 1 ワードあたり 4 バイトをパックするのに対し、Java 文字列変数は 1 ワードあたり 2 ハーフ ワードをパックするという事実に関連しています)

4

2 に答える 2

4

実際のところ、 C には C 文字列変数はありません。それらは単なる配列、つまり文字の配列です。Cの 1 つcharが を占め1 byteます。文字列リテラルは文字の配列として格納され、最後に終端\0が追加されます。

Java プログラミング言語では、文字列はオブジェクトです。String には以下が含まれます。

  1. 実際の文字を含むchar 配列— したがって、別個のオブジェクト — です。
  2. 文字列が始まる配列への整数オフセット。文字列の長さ;
  3. ハッシュコードのキャッシュされた計算のための別の 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

于 2013-08-26T08:18:41.843 に答える
1

AC 文字列は、nulバイトで終了する一連のバイトです。

Java String は、既知の長さを持ち、16 ビットの配列を参照するオブジェクトです。chars

String のメモリ割り当てははるかに高くなりますが、UTF-16 文字と O(1) 長さ操作がサポートされています。つまり、場合によっては高速になる可能性があります。

于 2013-08-26T08:02:39.320 に答える