使用字节标志来指示非空指针

时间:2015-11-20 16:28:33

标签: c++

我正在阅读有关Octrees的this文章,我注意到作者使用字节变量来保存有关每个Octree节点的活动子节点的信息。

byte m_activeNodes = 0;
然后他按如下方式使用

//Create child nodes
for (int a = 0; a < 8; a++)
{
    if (octList[a].Count != 0)
    {
        m_childNode[a] = CreateNode(octant[a], octList[a]);
        m_activeNodes |= (byte)(1 << a);
        m_childNode[a].BuildTree();
    }
}

然后在其余代码中,每当他想检查是否存在八叉树的活动节点时,他首先检查m_activeNodes,然后无忧无虑地访问m_childNode[index]。 例如:

//recursively update any child nodes.
for( int flags = m_activeNodes, index = 0; flags > 0; flags >>=1, index++)
    if ((flags & 1) == 1) m_childNode[index].Update(gameTime);

作者用C#编码,而不是用C ++编写代码,但我知道我只是将非活动节点设置为nullptr,然后在访问之前检查m_childNodes[index] == nullptr是否正确。

所以我的问题是他的方法是否比我的方法更有效,如果没有,它有什么好处。

1 个答案:

答案 0 :(得分:2)

字节字段不作为&#34;安全检查&#34; - 它作为优化。它为他提供了一个简单的检查,以确定当前节点是否是一个叶节点(没有子节点),而无需单独检查每个子指针。

即使有叶节点,该字段也允许循环在找到最后一个子节点后立即终止,而不是检查所有8个潜在的子节点。