C ++からDelphiにコードを移植するプロセスでは、STLコレクションを使用してコードをポートする必要があることが非常に多い。 Delphiが提供するコレクションのセットは非常に禁欲的であるため、
適切な代替品を見つけることは困難です。オブジェクトがスタックに配置されたり、独自のメモリアロケーターを使用したりするコードに出くわすことがあります。
提案されているデータリフレッシュモードが本当に嫌いです。データを更新するには、コレクションから配置された値を取得し、値を更新してから、変更値を戻す必要があります。これには、少なくとも2つの追加コピー操作が必要です。 VARパラメーターとしてデータ項目を手順に渡すことはできません。
コレクションがメモリの割り当て方法を変更する方法はありません。オブジェクトとレコードのメモリは、1つの共有ヒープから割り当てられます。使用後、メモリは慎重にヒープに戻す必要があります。メモリを正しく解放することは、必ずしも些細なタスクではありません。また、プロセッサの時間とプログラマーの時間がこのコードを記述するのに時間がかかります。 STLでは、あらゆる種類のコレクションに独自のメモリアロケーターを指定できます。
この実装は、記録とポインターに依存しています。これまでのところ、標準オブジェクトを使用して必要なものを実装する方法はありません。オブジェクトの作成と破壊は、メモリの共有ヒープを使用します。コールスタックにオブジェクトを配置する方法はありません。古き良き「オブジェクト」は非推奨と宣言されており、このタイプの新しい機能を追加することはサポートされていません。
このコレクションの実装は、型付けされたメモリ領域に基づいたメカニズムメモリ管理に依存しています。タイプされたメモリ領域を使用すると、多くのタスクの解決策を簡素化できます。
メモリを解放するタスクは簡単になり、はるかに速く行うことができます。
標準的なメモリマネージャーがスレッドセーフでなければならないことはよく知られています。いつでもメモリマネージャーにアクセスできるスレッドは1つだけです。メモリを割り当てて自由化することは、相互除外メカニズムを使用し、特にメモリが大量に解体されている場合、高速操作ではありません。個別の型型メモリ領域を使用する場合、必要なメモリを増やし、使用後に構造を削除する瞬間にのみ標準メモリマネージャーを参照します。
メモリアロケーターを指定する機能を備えた基本構造のサポート。リストの要素は、ポインターからアクセスされます。原則として、値のメモリは、いわゆるセグメント化されたメモリ領域にありますが、操作中に移動しません。地域のメモリを増やす必要がある場合は、追加のメモリセグメントが割り当てられます。これは、ポインターを介してそのような地域にあるデータ項目にアクセスできることを意味します。
配列には、いわゆる連続メモリ領域を使用します。データ項目はインデックスからアクセスされます。必要に応じて、地域のメモリを増やし、大きなサイズのセグメントがそのために割り当てられ、現在のメモリセグメントからのデータが新しいセグメントにコピーされます。データをコピーすると、古いセグメントが削除されます。
最終的に、ポインターを介して作業することは非常に便利で効率的です。コードははるかにシンプルになり、より簡潔になります。ただし、ポインターの経験がない場合は、「足で自分を撃つ」ことが簡単です。カプセル化のファンの場合、目的の構造をプライベートフィールドとして集約できます。次に、パブリックセクションの必要なメソッドとプロパティをオーバーライドすることにより、インターフェイスの必要な部分のみを開きます。インラインオプションを配置すると、追加費用は回避されます。 Delphiコンパイラは、オーバーライドされた方法のコードを生成しません。メソッドコールの場所では、集約構造法への直接の呼び出しがあります。
TsgTuple<T1, ...>ジェネリックタプルTsgArray<T>ジェネリック配列TsgList<T>値の一般的なリストTsgRecordList<T>ポインターによってアクセスされる値の一般的なリストTsgLinkedList<T>汎用方向リンクリストTsgForwardList<T>一般的な単方向リンクリストTsgHashMap<Key, T>ジェネリック順序辞書TsgMap<Key, T> 2-3ツリーに基づいた一般的な順序辞書TsgSet<Key>ジェネリックセットTsgPointerArrayポインターの無型リストTsgPointerListポインターによってアクセスされた値の未ティプドリストTCustomLinkedList UNTYPED BIDEECTIONAL LINKED LISTTsgCustomTree UNTYPED DICTIONARY Delphi Iteratorsの追加を開始しました。これでfor p in List do;最も興味深いのは、レコードを使用してイテレーターを実装し、機能することです。オブジェクトの使用と比較すると、生成されたコードははるかに効率的であり、これは優れていて、ヒープを呼び出すことはありません。イテレーターの変数はスタックにあります。これは私にとって非常に楽しい驚きであることが判明しました!
メモリアロケーターを指定する機能は、主にレコードを使用して作業することも意味します。通常、一部の構造では、1つ以上のメモリ領域を使用します。これは、シンプルなメモリマネージャーです。構造を使用した後、メモリ領域を解放することで占有されているすべてのメモリを返す機会があります。継承を使用して制限があります。場合によっては、継承を集約およびヘルパーに置き換えることができます。通常、コレクションを実装するために、これは問題ではありません。レコードを使用すると、コレクションを積み重ねることができます。これは時々非常に便利です。
オブジェクトプールを使用すると、オブジェクトを作成することがメモリ集約的である場合、または特定のタイプの限られた数のオブジェクトを作成できる場合、構造の再利用を管理できます。
何かの使用を停止した場合、構造やオブジェクトを削除する価値が常にありません。多くの場合、オブジェクトを再作成する必要があります。