C++ 在C+中声明指向指针的指针的效率+;
这听起来可能是个小问题,但在我正在创建的程序中,我有一个递归函数,其中我声明了一个指向类“QuadTree”指针的指针 i、 e: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
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".