根据多个来源,包括Wikipedia,实现二叉树的两种最常用方法是:
- 节点和指针(或引用),其中每个节点明确地持有其子节点。
- 数组,其中子节点的位置由其父节点的索引隐含地给出。
第二种方法在内存使用和局部性方面显然更优。但是,如果您想以可能使树不平衡的方式允许从树中进行插入和删除,则可能会导致问题。这是因为该设计的内存使用量是树深度的指数函数。
假设您想支持此类插入和删除。如何实现树,使得树遍历能够充分利用CPU缓存。
我在考虑为节点制作对象池,并将它们分配到一个数组中。这样,节点将靠在一起 -> 因此具有良好的局部性。
但是如果节点的大小与缓存行的大小相同,这是否有任何意义?
如果您的L1行大小为64字节,并且您访问std::vector<std::uint8_t>(64)
的第一个成员,则可能将向量的整个内容放入L1缓存中。这意味着您可以非常快地访问任何元素。但是,如果元素的大小与缓存行大小相同怎么办?由于对于L1、L2和L3缓存,缓存行很可能并没有太大的差异,因此似乎没有办法在这里利用引用局部性。我错了吗?还有什么其他办法吗?