红黑树中颜色的位域存储

问题描述

假设您想使用位域结构,而不是将颜色属性存储为 bool。这样,当 bool 可能占用整个字节时,颜色只占用 1 位。

如果每个位结构是 8 位,你会如何将它们映射到树中的节点?

我正在编写 C++,但这可能是伪代码或任何支持位域的东西。

解决方法

一种方法是将所有节点存储在一个数组中。

通常这并不理想,因为节点指针可以移动(即当您添加一个节点并调整底层向量的大小时)并且删除节点也有点困难。

如果您以这种方式实现它,那么每个节点都会在数组中具有一个索引,您可以在位域中重用该索引。这是一个隐式引用,因此不会占用更多空间。

除了前面提到的问题之外,这种方法还破坏了封装,所有这些都是为了每个条目节省约 63 位(在最佳情况下,编译器分配 64 位来存储您的字段,这在当今的硬件上很常见,实际上它可能更小).

如果您真的很关心空间,请寻找针对空间优化的数据结构(不为每个条目存储两个指针的数据结构)。

,

我使用对齐的节点(即,每个节点至少对齐 2 字节,但通常更多),然后使用持有的节点指针之一的低位来存储颜色值。这确实使检索和更新这些指针变得更加复杂。

通过我的库使用的分配器 (MSVC),我可以免费获得所需的对齐。