Я предполагаю, что ответ на это будет "Невозможно, переключитесь на С++". Но я думал, что все равно выброшу его.
Я имею дело с массивным двоичным деревом. У меня есть массив структур для представления узлов ветвей, которые я использую, чтобы помочь с локальностью памяти при итерации через дерево.
Чтобы сохранить немного памяти и, следовательно, улучшить локальность кэша, я рассматриваю перекрытие ссылки на объекты для листовых узлов. Эта ссылка на объект укажет на все данные листа. В основном, что-то вроде этого:
[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;
}
Вышеприведенная информация дает следующую ошибку времени выполнения
Не удалось загрузить тип "BranchData" из сборки 'WindowsFormsApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ', потому что он содержит поле объекта со смещением 0 который неправильно выровнен или перекрыт полем, отличным от объекта.
Я мог бы использовать отдельный массив для хранения листовых данных и использовать индексы для указания на этот массив, но затем у меня есть 2 просмотра памяти (для того, что, безусловно, отдаленные области памяти). Один для местоположения в массиве листьев, чтобы получить ссылку, и один для получения данных листа. Если я смогу достичь этого перекрытия, я избавлюсь от одного из этих запросов.
Я могу привязывать объекты и использовать небезопасный код для решения этой проблемы. Здесь ключевой элемент - скорость.