web-dev-qa-db-ja.com

文字列は何バイトを占めますか?

以下の文字列が占めるバイト数を誰かに教えてもらえますか?

string abc = "a";
28
Mohit Kumar

私の 文字列に関する記事 から:

現在の実装では、少なくとも、文字列は20+(n/2)* 4バイト(n/2の値を切り捨て)を占めます。ここで、nは文字列内の文字数です。文字列型は、オブジェクト自体のサイズが異なるという点で珍しいものです。これを行う他の唯一のクラスは(私の知る限り)配列です。基本的に、文字列はメモリ内の文字配列に、配列の長さと文字列の長さ(文字数)を加えたものです。文字列はmscorlib.dll内で "割り当て超過"になり、作成を容易にすることができるため、配列の長さは常に文字数と同じであるとは限りません。 (たとえば、StringBuilderがこれを行います。)文字列は外界に対して不変ですが、mscorlib内のコードは内容を変更できるため、StringBuilderは現在の内容が必要とするよりも大きな内部文字配列を持つ文字列を作成し、その文字列に追加します。文字配列は対処するのに十分な大きさではなくなり、その時点で、より大きな配列を持つ新しい文字列が作成されます。文字列長のメンバーには、その最上位ビットに、文字列に非ASCII文字が含まれているかどうかを示すフラグも含まれています。これにより、場合によっては追加の最適化が可能になります。

64ビットCLRを使用する機会が得られる前に作成されたと思います。 64ビットの土地では、各文字列がさらに4バイトまたは8バイトを占めると思います。

編集:私は ブログ投稿 を最近書きましたが、これには64ビット情報が含まれています(x86では上記と少し矛盾しています...)

35
Jon Skeet

基本的に、各文字列オブジェクトには、オブジェクトデータ用に一定の20バイトが必要です。バッファには、文字ごとに2バイトが必要です。バイト単位の文字列のメモリ使用量の見積もり:20 +(2 *長さ)。したがって、通常、この文字列のCLR内のメモリ:22バイト

ただし、この文字列を別の端に渡したり送信したりする間、または他の使用法では、これほど多くのメモリは必要ありません(オブジェクトデータに20バイトは必要ありません)。したがって、使用するエンコーディングのタイプによって異なります。

デフォルトのエンコーディングでは、1文字に1バイトかかります。

したがって、デフォルトのエンコーディングではAnswerは1バイトです。

このコードで確認できます:

Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1.
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3.
10
WAP Guy

stringオブジェクトのサイズについて質問する場合、そのサイズについて質問するのは間違いです。デバッガーがないと、正確に何であるかを言うことはできません。デバッガでも可能かどうかはわかりません。 stringは内部的にポインターを使用します。

文字列がUTF-16で格納されているため、含まれている文字シーケンスのサイズについて尋ねると、4になります。 Basic Multilingual Planeのすべての文字は2バイトでコード化されています。

1
Andrey