2015-10-04 18 views
11

Cには、コンパイラには文字列の先頭へのポインタがあり、終了記号('\0')を持っています。ユーザーが文字列の長さを計算したい場合、コンパイラは'\0'が見つかるまで文字列配列の要素を数えなければなりません。コンパイラの観点から文字列はどのように見えますか?

UCSD-stringsには、コンパイラの最初の記号の文字列の長さがあります。

コンパイラはC#-stringsについて何を考えていますか?はい、ユーザーの観点からStringobjectで、フィールドがであり、高レベルのものではありません。私は深いアルゴリズムを知りたい。たとえば、コンパイラは文字列の長さをどのように計算しますか?

+4

あなたのCの仮定は間違っています。 Cコンパイラは**各文字列の長さを正確に**知っています。これを見るには、文字列の 'sizeof'を呼び出します(文字列の_pointerではなく!)。 – MSalters

+1

通常、私は偽装としてこれを閉じますが、重複は悪いです。 http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED – usr

+0

@MSaltersあなたはコンセプトを混乱させています。配列と文字列は異なるエンティティで、それらにはそれぞれ異なる操作が関連付けられています。それらは関連していますが、それらは異なる抽象であり、混在させるべきではありません。 –

答えて

21

のは、次のコードを実行してみましょう:

string s = "123"; 
string s2 = "234"; 
string s3 = s + s2; 
string s4 = s2 + s3; 
Console.WriteLine(s + s2); 

それでは、最後の行にブレークポイントを入れて、メモリウィンドウを開いてみましょう:中s3を書く

Strings

メモリウィンドウでは、2(s3s4)文字列最初に4バイトのサイズで1つずつ割り当てられます。

また、stringsクラスタイプのトークンやその他のstringクラスのデータなど、他のメモリが割り当てられていることがわかります。

string class自体がstringの長さが含まれているメンバーprivate int m_stringLength;が含まれ、これはまたstring.Concat()が(最初に全体の長さを割り当てることによって)超高速実行させる:

int totalLength = str0.Length + str1.Length + str2.Length; 

String result = FastAllocateString(totalLength); 
FillStringChecked(result, 0, str0); 
FillStringChecked(result, str0.Length, str1); 
FillStringChecked(result, str0.Length + str1.Length, str2); 

私は少し奇妙見つける何stringIEnumerable<char>.Count()の実装は、がICollection<T>.Countプロパティを使用して実装されているList<T>のように、ICollection<T>のようにアイテムを1つずつ反復することを意味するデフォルトの実装を使用して行われます。

+2

@homkこれがあなたが知りたかったことであれば、本当の質問は「コンパイラの視点から」とはまったく関係がありません。 – EJP

6

C#では、文字列の長さがプライベートフィールド([NonSerialized]private int m_stringLength;)のオブジェクトに格納されているため、実行時に計算する必要はありません。

The source code of String class is available online.

関連する問題