c++ - bool 内存高效链表

标签 c++ data-structures c++17

您将如何实现一个内存高效的 bool 链表?显然下一个节点指针比常规链表中的有效负载本身大得多。

最佳答案

在大于 1 字节的边界上对齐节点,并使用“下一个”指针的最低有效位对 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;
};

关于c++ - bool 内存高效链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42600283/

相关文章:

java - 是否有空空闲列表数据结构?

algorithm - 总和小于或等于给定 'k' 的子数组数

c++ - C++ 14或C++ 1z是否已经或将不再不确定以调用委托(delegate)类成员函数指针?

c++ - 在编译时从可能类型的集合中获取整数?

c++ - 关于由外部系统删除 O(1) 列表的迭代器使用的架构 C++/STL 问题

c++ - 正在运行的线程中是否可以使用 QThread::quit

c++ - 为什么仅通过使用命名空间std删除就摆脱了错误(对 “”的引用不明确);在C++中?

c++ - 使用不适合其相关类型的转义序列

data-structures - 实现不可变的、可增长的向量

templates - SFINAE 上缺少一些内容(虚拟模板参数形式)