将信息掩码到指针中 - C++ (Boost.Intrusive)

Mask information into a pointer - C++ (Boost.Intrusive)

在 Boost 上,我读到有关将信息屏蔽到指针中以节省内存的信息(此处:https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/set_multiset.html、optimize_size)。这怎么可能?我在某处读到指针仅使用 48 位,但长度为 64 位,因此您可以通过位移将信息推送到更高位。对吗?

为什么他们使用整数来存储rb-trees的颜色信息?使用字符不是更有效率吗?

On Boost I read about masking information into pointers to save memory (here: https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/set_multiset.html, optimize_size). How is this possible?

答案在您发布的 link 中给出:

The hook will embed the color bit of the red-black tree node in the parent pointer if pointer alignment is even.

偶数对齐时,指针值的最低位始终为零,可用于存储颜色位。每当需要加载指针或颜色时,需要清除其他位,这会增加轻微的性能影响,但在 return 中它会在挂钩中保存一个价值 space 的指针。但在实践中,性能开销通常被 CPU.

中指令的并行执行所隐藏

I read somewhere that pointers only use 48 Bit, but are 64 Bits long, so you can push your information in the higher bits with bit shifting. Is that correct?

在 64 位系统上,指针的大小是 64 位,但有些系统不实现全角指针,而是使用较少的位来寻址。当高位未使用时,它们需要具有特定值(x86 中的值)。 Wikipedia 很好地概述了不同的 CPU,包括 x86。你会看到不同的架构有不同的限制,有些甚至实现了全角 64 位寻址。因此,虽然可以在高位存储额外的数据,但并非在所有架构上都是可能的,并且在不同的 CPU 架构上清除逻辑可能不同。

Why are they using an integer to store the color information of rb-trees? Would it not be more efficient to use chars?

A char 是一个整数。颜色信息实际上是一位(红色或黑色节点)。其他位,无论是 char 还是 int,都未使用。要回答您的问题,在某些情况下使用 char 可能更有效,但在 Boost.Intrusive 挂钩的情况下则不然。因此,当启用 optimize_size 时,Boost 不会使用这两种类型来存储颜色。当它未启用时,枚举(通常与 int 大小相同)用于存储颜色标签,但这并不重要,因为由于对齐,添加了一个价值 space 的指针到钩子。 (在基本挂钩的情况下,一些添加的填充可用于其他有用的数据,但仅在非常特殊的情况下,当节点二进制布局中紧跟在挂钩之后的第一个非静态数据成员具有小对齐时。)