これに対する答えは、「それは不可能です。C++ に切り替えてください」になると思います。でも、とにかく捨てようと思いました。
私は大規模な二分木を扱っています。ツリーを反復処理するときにメモリの局所性を支援するために使用する分岐ノードを表す構造体の配列があります。
メモリを少し節約して、キャッシュの局所性を向上させるために、リーフ ノードのオブジェクト参照をオーバーラップさせることを考えています。そのオブジェクト参照は、すべてのリーフ データを指します。基本的には、次のようなものです。
[StructLayout(LayoutKind.Explicit)]
struct BranchData
{
[FieldOffset(0)] // 1 byte
internal byte SplitIndex;
[FieldOffset(1)] // 4 bytes
internal float SplitValue;
[FieldOffset(5)] // 4 bytes
internal int LowIndex;
[FieldOffset(9)] // 4 bytes
internal int HighIndex;
[FieldOffset(0)] // 8 bytes (We're working with x64 here)
internal LeafData Node;
}
上記は、次の実行時エラーを与えます
アセンブリ 'WindowsFormsApplication1、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' から型 'BranchData' を読み込めませんでした。オフセット 0 のオブジェクト フィールドが正しく配置されていないか、オブジェクト以外のフィールドと重複しているためです。
別の配列を使用してリーフ データを格納し、インデックスを使用してその配列を指すこともできますが、2 つのメモリ ルックアップがあります (メモリの離れた領域であることは確かです)。1 つは参照を取得するためのリーフ配列内の場所で、もう 1 つはリーフ データを取得するためのものです。このオーバーラップを達成できれば、それらのルックアップの 1 つを取り除きます。
オブジェクトを固定し、安全でないコードを使用してこの問題を解決できます。ここではスピードが重要な要素です。