ArraySortHelper<T>
IComparer<T>
Compare(T x, T y)
Copy Source | Copy HTMLstatic public void Sort <T、TValue>(T []キー、TValue []値、 int左、 int右、IComparer <T>比較器){する{int index = left;int num2 = right;T y =キー[インデックス+((num2-インデックス)>> 1 )];する{試してみる{/ * Cmp 1 * / while (comparer.Compare(keys [index]、y)< 0 ){インデックス++;}/ * Cmp 2 * / while (comparer.Compare(y、keys [num2])< 0 ){num2--;}}catch ( IndexOutOfRangeException ){新しい ArgumentException ( null 、 "keys" )をスローします。}catch ( 例外 ){新しい InvalidOperationException ()をスローします。}if (インデックス> num2){休憩 ;}if (インデックス<num2){T local2 =キー[インデックス];キー[インデックス] =キー[num2];キー[num2] = local2;if (値!= null ){TValue local3 =値[インデックス];値[インデックス] =値[num2];値[num2] = local3;}}インデックス++;num2--;}while (インデックス<= num2);if ((num2-left)<=(right-index)){if (左<num2){/ * Call 1 * / Sort <T、TValue>(keys、values、left、num2、comparer);}左=インデックス。}他に{if (インデックス<右){/ *呼び出し2 * /ソート<T、TValue>(キー、値、インデックス、右、比較子);}right = num2;}}while (左<右);}
Copy Source | Copy HTML
comparer.Compare(a, b)
a - b
comparer
null
Compare
CompareTo
callvirt
call
T
int
Copy Source | Copy HTMLクラス GenericComparer < T >:IComparer < T > ここで、 T : IComparable < T >{public int Compare( T x、 T y){if (x!= null ){if (y!= null ){return x.CompareTo(y);}1を 返します。}if (y!= null ){return - 1 ;}0を 返し ます 。}}
Copy Source | Copy HTMLクラス IntComparer : IComparer < int >{public int Compare( int x、 int y){return x-y;}}
Copy Source | Copy HTMLstatic public void SortNoVirt <T、TValue、TCmp>(T []キー、TValue []値、 int left、 int right、TCmp comparer) ここで、 TCmp: IComparer <T>{// ...}struct IntComparerNoVirt : IComparer < int >{public int Compare( int x、 int y){return x-y;}}
sizeof
sizeof(array) / sizeof(array[0])
Copy Source | Copy HTMLクラス IntObj : IComparable < IntObj >{パブリックint値 。public int CompareTo( IntObjその他){戻り値 -その他。 値 ;}}
*.ref
*.i4
Debugger.Break();
Copy Source | Copy HTML/ **************************************************** **************************** // *適切なチェックをすべて行った後、配列[idx]に「val」を割り当てます* /HCIMPL3( void 、JIT_Stelem_Ref_Portable、PtrArray *配列、符号なしidx、 Object * val){if (!配列){FCThrowVoid(kNullReferenceException);}if (idx> = array-> GetNumComponents()){FCThrowVoid(kIndexOutOfRangeException);}if (val){MethodTable * valMT = val-> GetMethodTable();TypeHandle arrayElemTH = array-> GetArrayElementTypeHandle();if (arrayElemTH!= TypeHandle(valMT)&& arrayElemTH!= TypeHandle(g_pObjectClass)){TypeHandle :: CastResult result = ObjIsInstanceOfNoGC(val、arrayElemTH);if (result!= TypeHandle :: CanCast){HELPER_METHOD_FRAME_BEGIN_2(val、配列);//これはArrayStoreCheck(&val、&array);と同等です。#ifdef STRESS_HEAP//ストレスレベルが十分に高い場合、すべてのjitでGCを強制しますif (g_pConfig-> GetGCStressLevel()!= 0#ifdef _DEBUG&&!g_pConfig-> FastGCStressLevel()#endif)GCHeap :: GetGCHeap()-> StressHeap();#endif#if CHECK_APP_DOMAIN_LEAKS//インスタンスがアジャイルの場合、またはアジャイルをチェックするif (!arrayElemTH.IsAppDomainAgile()&&!arrayElemTH.IsCheckAppDomainAgile()&& g_pConfig-> AppDomainLeaks()){val-> AssignAppDomain(array-> GetAppDomain());}#endifif (!ObjIsInstanceOf(val、arrayElemTH)){COMPlusThrow(kArrayTypeMismatchException);}HELPER_METHOD_FRAME_END();}}//最適化されたJIT_Stelem_Refのパフォーマンスゲイン// jitinterfacex86.cppは、主にJIT_WriteBarrierReg_Bufの呼び出しが原因です。//ここで直接書き込みバリアを呼び出すことにより、//インラインアセンブリをMSVCからgccに変換することを回避できます//ほとんどのパフォーマンス向上を維持しながら。HCCALL2(JIT_WriteBarrier、( Object **)&array-> m_Array [idx]、val);}他に{// NULLの書き込みバリアを通過する必要はありませんClearObjectReference(&array-> m_Array [idx]);}}HCIMPLEND
System.Object
Source: https://habr.com/ru/post/J69520/More articles:市民の受け入れ:州の組織に「電子キュー」を導入した経験Nginx:時間通りバグ駆動型開発Habrに関するトピックの議論の範囲サンクトペテルブルクはMoneyMailを通して「共同」の支払いができますブースト1.40.0が登場Snow LeopardのブレーキデータURI [CSS] Sprites 1.5-独自の自動CSSスプライトジェネレーターYablokoパーティーのリーダーからプログラマーの日に少し遅れてお祝い質問へのコメントAll Articles