問題は明らかに64ビットシステムでの8バイトポインタです
あなたが本当にメモリフットプリントを最小化しようとしていて、それを達成するために踊る気があるなら、私たちはポインタサイズを減らすことを試みることができます
32ビットポインタに移動することはお勧めしません。4GBのRAMにしかアクセスできないためです。これは、大量のメモリを使用している場合は十分ではない可能性があります。
私はこのややクレイジーなアプローチを提案することができます:
構造体には、通常のヒープの代わりにカスタムアロケータを使用します。カスタムアロケータは、基本的に、この特定の構造体のインスタンスに対して、自分で管理する別のヒープを使用していることを意味します。Windows OSでは、これはHeapCreate()で非常に簡単に実行できます。Linuxでは、次の質問で参照されているようにmmapを使用します:HeapCreate、LinuxのHeapAlloc、Linuxのプライベートアロケータ
この構造体タイプには個別のヒープがあるため、このヒープはこの構造体のインスタンスの割り当てと割り当て解除のみを行います。まったく同じサイズのすべての割り当てを使用するとヒープの断片化がなくなるため、これ自体が1つの大きな最適化です。
さて、トリックのために。すべてのインスタンスはこの個別のヒープ内にあるため、インデックスを付けることができます。割り当てられたポインターを取得し、ヒープ開始ポインターを減算して、構造体サイズで除算するだけです。ヒープ内の最初の構造体はインデックス0を取得し、2番目はインデックス1を取得します。構造体へのポインタではなく、構造体のインデックスを保存します。これらのインデックスはスペース効率がはるかに高く、ポインタに簡単に戻すことができます。
もちろん、このアプローチでは、セル構造体へのポインターのみが最小化されます。汎用ヒープ内の一般的なポインターではありません。構造体のサイズで割るのが危険だと感じる場合(これを行うと、すべての構造体がヒープ内で連続していると想定します)、この手順をスキップするだけで、数ビットしか節約できません。ヒープスタートをサブストラクチャするだけで、多くのスペースを節約できます。
少しやり過ぎですが、それでも楽しいです:)