C++ 在C+中声明指向指针的指针的效率+;

C++ 在C+中声明指向指针的指针的效率+;,c++,performance,pointers,C++,Performance,Pointers,这听起来可能是个小问题,但在我正在创建的程序中,我有一个递归函数,其中我声明了一个指向类“QuadTree”指针的指针 i、 e: void check_tree(QuadTree* p_qtree, Object* p_obj) { if (!p_qtree->is_leaf()) { QuadTree** children = p_qtree->get_children(); // <-- WHAT I'M REFERRING TO for (in

这听起来可能是个小问题,但在我正在创建的程序中,我有一个递归函数,其中我声明了一个指向类“QuadTree”指针的指针

i、 e:

void check_tree(QuadTree* p_qtree, Object* p_obj)
{
  if (!p_qtree->is_leaf())
  {
    QuadTree** children = p_qtree->get_children();  // <-- WHAT I'M REFERRING TO
    for (int i = 0; i < 4; i++)
      check_tree(children[i], p_obj);
  }
  else
  {
    ...
  }
}
void check_树(四叉树*p_qtree,Object*p_obj)
{
如果(!p_qtree->is_leaf())
{
四叉树**children=p_qtree->get_children();//该行为被调用,通常被认为是不好的

您可以轻松地避开引用(既有“性能”又有可读性):

void check_树(四叉树&p_qtree,对象&p_obj){
如果(!p_qtree.is_leaf()){
QuadTree&children=p_qtree.get_children();//应返回对QuadTree的引用
对于(int i=0;i<4;i++)
检查_树(子对象,p_obj);
}
// ...
}
就性能而言,每个指针都是一个额外的间接层次。但是编译器优化的方式是无限的。

这种行为被调用,通常被认为是不好的

您可以轻松地避开引用(既有“性能”又有可读性):

void check_树(四叉树&p_qtree,对象&p_obj){
如果(!p_qtree.is_leaf()){
QuadTree&children=p_qtree.get_children();//应返回对QuadTree的引用
对于(int i=0;i<4;i++)
检查_树(子对象,p_obj);
}
// ...
}

就性能而言,每个指针都是一个额外的间接层次。但是编译器优化的方式是无限的。

从性能角度看,分配大小为n的堆栈和大小为m的堆栈没有区别(它们都编译为读取寄存器、添加常量值并将值存储回同一寄存器)

内存方面,通过在函数中声明变量,堆栈的每个级别将使用额外的8字节(在64位机器上)或4字节(在32位机器上)。依我看,可以忽略不计。此外,如果可以安全地完成此操作,编译器可能能够对此进行优化


就正确性而言,在外部分配内存会使您的函数不可重入。当您使用多个线程时,这可能是一个问题。

就性能而言,分配大小为n的堆栈和大小为m的堆栈没有区别(它们都编译为读取寄存器、添加常量值并将值存储回同一寄存器)

内存方面,通过在函数中声明变量,堆栈的每个级别将使用额外的8字节(在64位机器上)或4字节(在32位机器上)。依我看,可以忽略不计。此外,如果可以安全地完成此操作,编译器可能能够对此进行优化


就正确性而言,在外部分配内存会使函数不可重入。当您使用多个线程时,这可能是一个问题。

在这种情况下,在外部声明它会导致出现错误:当第二次递归调用
check_tree
时,如果存在非叶,则会覆盖
子线程
变量在另一片非叶子里面

check_tree
   children = something
   recursive check_tree when i=0
       children = overwritten with something
   recursive check_tree when i=1 -> has the incorrect "children".

在这种情况下,在外部声明它将导致一个错误:当第二次递归调用
check_tree
时,如果在另一个非叶中有一个非叶,则将覆盖
子项
变量

check_tree
   children = something
   recursive check_tree when i=0
       children = overwritten with something
   recursive check_tree when i=1 -> has the incorrect "children".

当C++可用时(如本例中),它肯定是有效的,但这不能回答发布的问题。C++可用时(如本例中),当然是有效的。,但这并不能回答发布的问题。将变量移到外部会产生一个bug。请参阅下面的解释。是的,你是对的。感谢你指出这一点。将变量移到外部会产生一个bug。请参阅下面的解释。是的,你是对的。感谢你指出这一点。
check_tree
   children = something
   recursive check_tree when i=0
       children = overwritten with something
   recursive check_tree when i=1 -> has the incorrect "children".