Я пишу реализацию дерева B + в C #, и реализация дерева, которую я выбрал для своего приложения, имеет очень специфическую структуру, которая учитывает кеширование.Для достижения этих свойств у него есть строгие политики компоновки на узлах дерева.
То, что я хочу, просто выражается с помощью ключевого слова C # fixed для буферов фиксированного размера:
public abstract class Tree<K, T> { }
sealed class Node<K, T> : Tree<K, T>
{
Node<K, T> right;
fixed Tree<K, T> nodes[127]; // inline array of 128 nodes
}
К сожалению, буферы фиксированного размера могут использоваться только с примитивными типами значений, такими как int и float.Простое использование простых массивов добавит косвенные указатели, которые разрушат кеш-свойства этого типа дерева.
Я также не могу сгенерировать 128 полей и использовать арифметику указателей для извлечения нужного поля, потому что естьнет преобразований между типами указателей и управляемыми объектами .
Осталось только генерировать 128 полей с индексатором, который выбирает правильное на основе переключателя (который не может быть быстрым), или записыватьэто как библиотека C и использование P / Invoke, что также может снизить производительность.
Есть предложения?