布尔内存高效链表
Boolean memory efficient linked list
你将如何实现一个内存高效的布尔链表?显然下一个节点指针比常规链表中的有效负载本身大得多。
这是一个大概的想法。在您的链表节点中,有两个字段,第一个是指向下一个节点的指针,第二个是另一个与您系统上的指针大小相等的整数成员。例如,在 64 位架构上:
struct node {
node *next;
uint64_t bits;
}
然后每个节点存储 64 个布尔值,而不仅仅是标准链表实现中的一个。许多操作的时间效率降低(但这是 memory/space 效率的通常折衷),因为当您添加第 65 个布尔值或插入 [=19 时,您将不得不进行一些位移和类似于树平衡的操作=] bitset 等(此外,进一步考虑,您可能需要第三个成员告诉您使用的位数。)
但是,这有一些优点,因为像这样的简单结构非常适合缓存。
就像我说的,这只是一个粗略的想法,实施这样的事情可能会有很多陷阱。编写好的测试。
在大于 1 字节的边界上对齐节点,并使用 'next' 指针的最低有效位对 bool 值进行编码。
我不太擅长直接在文本框中编码,但大致如下:
struct node {
static_assert(alignof(node) > 1, "node is insufficiently aligned");
bool get_value() const {
return static_cast<bool>(reinterpret_cast<size_t>(next) & 0x1);
}
void set_value(bool value) {
size_t ptr = reinterpret_cast<size_t>(next);
ptr &= ~1;
ptr |= static_cast<size_t>(value);
next = reinterpret_cast<node*>(ptr);
}
node* get_next() const {
size_t ptr = reinterpret_cast<size_t>(next);
ptr &= ~1;
return reinterpret_cast<node*>(ptr);
}
void set_next(node* n) {
bool value = get_value();
next = n;
set_value(value);
}
private:
node* next;
};
你将如何实现一个内存高效的布尔链表?显然下一个节点指针比常规链表中的有效负载本身大得多。
这是一个大概的想法。在您的链表节点中,有两个字段,第一个是指向下一个节点的指针,第二个是另一个与您系统上的指针大小相等的整数成员。例如,在 64 位架构上:
struct node {
node *next;
uint64_t bits;
}
然后每个节点存储 64 个布尔值,而不仅仅是标准链表实现中的一个。许多操作的时间效率降低(但这是 memory/space 效率的通常折衷),因为当您添加第 65 个布尔值或插入 [=19 时,您将不得不进行一些位移和类似于树平衡的操作=] bitset 等(此外,进一步考虑,您可能需要第三个成员告诉您使用的位数。)
但是,这有一些优点,因为像这样的简单结构非常适合缓存。
就像我说的,这只是一个粗略的想法,实施这样的事情可能会有很多陷阱。编写好的测试。
在大于 1 字节的边界上对齐节点,并使用 'next' 指针的最低有效位对 bool 值进行编码。
我不太擅长直接在文本框中编码,但大致如下:
struct node {
static_assert(alignof(node) > 1, "node is insufficiently aligned");
bool get_value() const {
return static_cast<bool>(reinterpret_cast<size_t>(next) & 0x1);
}
void set_value(bool value) {
size_t ptr = reinterpret_cast<size_t>(next);
ptr &= ~1;
ptr |= static_cast<size_t>(value);
next = reinterpret_cast<node*>(ptr);
}
node* get_next() const {
size_t ptr = reinterpret_cast<size_t>(next);
ptr &= ~1;
return reinterpret_cast<node*>(ptr);
}
void set_next(node* n) {
bool value = get_value();
next = n;
set_value(value);
}
private:
node* next;
};