TL;DR Я быстро написал пробную версию реализации XorLinkedList а> на С#.
Это абсолютно возможно с использованием небезопасного кода на C#. Однако есть несколько ограничений:
- XorLinkedList должен быть «неуправляемой структурой», т. е. он не может содержать управляемые ссылки.
- Из-за ограничения универсальных шаблонов C# связанный список не может быть универсальным (даже с
where T : struct
).
Последнее, по-видимому, связано с тем, что вы не можете ограничить универсальный параметр неуправляемыми структурами. С помощью всего лишь where T : struct
вы также разрешите структуры, содержащие управляемые ссылки.
Это означает, что ваш XorLinkedList может содержать только примитивные значения, такие как целые числа, указатели или другие неуправляемые структуры.
Низкоуровневое программирование на C#
private static Node* _ptrXor(Node* a, Node* b)
{
return (Node*)((ulong)a ^ (ulong)b);//very fragile
}
Очень хрупкий, я знаю. Указатели C# и IntPtr не поддерживают оператор XOR (вероятно, хорошая идея).
private static Node* _allocate(Node* link, int value = 0)
{
var node = (Node*) Marshal.AllocHGlobal(sizeof (Node));
node->xorLink = link;
node->value = value;
return node;
}
Не забудьте Marshal.FreeHGlobal
эти узлы впоследствии (реализуйте полный IDisposable и не забудьте разместить бесплатные вызовы за пределами блока if(disposing)
.
private static Node* _insertMiddle(Node* first, Node* second, int value)
{
var node = _allocate(_ptrXor(first, second), value);
var prev = _prev(first, second);
first->xorLink = _ptrXor(prev, node);
var next = _next(first, second);
second->xorLink = _ptrXor(node, next);
return node;
}
Заключение
Лично я бы никогда не использовал XorLinkedList в C# (возможно, в C, когда я пишу действительно низкоуровневые системные вещи, такие как распределители памяти или структуры данных ядра. В любом другом случае небольшой выигрыш в эффективности хранения действительно не стоит боли. тот факт, что вы не можете использовать его вместе с управляемыми объектами в C#, делает его практически бесполезным для повседневного программирования.
Кроме того, хранилище сегодня почти бесплатно, даже основная память, и если вы используете C #, вы, вероятно, не слишком заботитесь о хранилище. Я где-то читал, что заголовки объектов CLR были около 40 байт, так что этот указатель будет наименьшей из ваших проблем;)
person
Christian Klauser
schedule
13.05.2011