一般的に、侵入型のコレクションはメモリ使用量の点で最も効率的です。あなたの目標が行く唯一の方法であるすべての最後のCPUサイクルを絞ることであれば。
ブースト共有ポインタのリストを検討してください。新しいオブジェクトを作成するときに何がされているが起こる:
- ヒープから割り当てられたオブジェクト及びブースト
- コンストラクタを初期化し、生のポインタからポインタを共有object'a参照カウンタを格納するために、ヒープ上の別のオブジェクトを割り当てます(その参照カウンタがこの割り当てを回避するオブジェクトに格納されているので、侵入ポインタを高める理由であることは優れている)
- リスト::インサートは上記で共有ポインタ
をリストノードコピーを割り当て、3つが存在しますメモリ割り当て新しいオブジェクトを作成してコレクションに挿入することができます。
ここでは、侵入型リストの使用を検討します。同じタスクのために何が起こるかです:
- 新しいオブジェクトが割り当てられ、初期化される
- リスト::挿入ノードがオブジェクトに埋め込まれており、すでに割り当てられているので、ちょうど、オブジェクトのリストのノードポインタに割り当てます
ここでは、1つのメモリ割り当てしか行われません。侵入型コレクションを使用する場合、CPUのメモリ消費量が少なくなるため、CPUキャッシュがより有効に利用され、メモリフットプリントの削減に伴うキャッシュミスの減少(参照整合性のローカリティ)が低下します。
侵入型コレクションの欠点は、オブジェクトが一度にどのような要素になりうるかを、事前にどのタイプとコレクション数で知っておく必要があるかということです。私の個人的な経験では、この余分な初期の考え方は、よりクリーンでシンプルなデザインにつながります。
こんにちは....ありがとう...しかし、私は最後の文章でちょっとしたことに気づいた....あなたはそれをもっと詳しく説明できますか? 具体的には、「オブジェクトが一度に要素になることができるタイプとコレクションの数」というときはどういう意味ですか? –
侵入型コレクションを使用する場合、オブジェクトはコレクションノードを埋め込む必要があります。したがって、例えばオブジェクトが1つの侵入リストに保持されている場合、オブジェクトは1つのリストノードを埋め込む必要があります。オブジェクトが2つのリストに同時に存在する必要がある場合は、2つのリストノードなどを埋め込む必要があります。 –
ohk ....それを持って..ありがとう... –