Я пишу дерево B + по разным причинам и пришел сюда, чтобы задать вопрос о реализации его узлов. Мои узлы в настоящее время выглядят так:
struct BPlusNode
{
public:
//holds the list of keys
keyType **keys;
//stores the number of slots used
size_t size;
//holds the array of pointers to lower nodes NULL if this is a leaf node
BPlusNode **children;
//holds the pointer to the next load to the 'left'
BPlusNode *next;
//Data page pointers NULL if this is a branch node
Bucket **pages;
};
Как видите, моя текущая реализация использует * * в том месте, где мне интересно, стоит ли мне использовать * * или *.
Мне хорошо известен тот факт, что * * требует две операции разыменования и, следовательно, медленнее, чем простое использование *, однако этот класс использует большую рекурсию, и гораздо удобнее передавать указатели на под вызовы рекурсивного функции. Чтобы сделать это с *, мне нужно сделать арифметику с указателями и передать полученный указатель.
С **
someFunction(BPlusNode* currNode)
{
......
someFunction(currNode->children[ChildIndex]);
}
с *
someFunction(BPlusNode* currNode)
{
......
someFunction((currNode->children) + ChildIndex);
}
Я вижу, что есть дополнительное считывание памяти для получения нужного указателя в версии * *, но версия * * также проще для меня (она более близко соответствует тому, как я вижу нарисованные диаграммы). в «Искусстве компьютерного программирования» и в википедии).
У кого-нибудь есть мысли так или иначе? Предложения по третьему варианту? Доказательство того, почему одно превосходит другое? и т.д.
Edit:
Я мог бы опубликовать это как ответ ниже, но я только что понял, что со схемой * * мне не нужно копировать все содержимое каждого подузла или сегмента, если я хочу вставить один в середину массива (т.е. изменить размер массива) , Если при перераспределении массива имеется 20 подузлов для схемы *, мне потребуется скопировать 20 * байтов sizeof (BPlusNode), в отличие от 20 * байтов sizeof (BPlusNode *) для схемы * *.
С другой стороны, мне пришло в голову, что, поскольку я выполняю все вставки и разбиения страниц, выполняется заранее, возможно, такая повышенная эффективность их выполнения не нужна, а преимущества * over * * в поисках перевешивают это.