在下面的代码中,我不应该通过引用传递 newNode,因为我没有修改它吗?
void IntBinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
{
if (nodePtr == 0)
nodePtr = newNode;
else if (newNode->value < nodePtr->value)
insert(nodePtr->left, newNode);
else
insert(nodePtr->right, newNode);
}
最佳答案
通过引用传递指针引入了额外的间接级别。
本质上它对应于将指针传递给指针,尽管编译器可以选择对其进行优化。
因此,它可能会在堆栈空间或寄存器使用方面产生成本,此外还有取消引用的时间,这与按值传递指针的基本成本相当,甚至有所增加。
如果您不修改指针,则没有理由潜在地产生该成本。
在更高层次上,引用向读者表明指针可能会被修改,但实际上并没有。
那是不好的。
所以答案是否定的,出于性能原因和清晰起见,在保证未修改的情况下,您最好不要通过引用传递 newNode
指针。
给定的代码
void IntBinaryTree::insert(TreeNode *&nodePtr, TreeNode *&newNode)
{
if (nodePtr == 0)
nodePtr = newNode;
else if (newNode->value < nodePtr->value)
insert(nodePtr->left, newNode);
else
insert(nodePtr->right, newNode);
}
……可以更好地表达为
void IntBinaryTree::insert(TreeNode*& nodePtr, TreeNode* const newNode)
{
if (nodePtr == nullptr)
nodePtr = newNode;
else if (newNode->value < nodePtr->value)
insert(nodePtr->left, newNode);
else
insert(nodePtr->right, newNode);
}
const
向读者传达该指针值将在整个函数体中保持不变。
我认为 if
-else
很好,即使严格应用 Don't Repeat Yourself 原则会指示条件表达式。这是因为这里的if
-else
结构有助于降低代码的局部复杂度。如果用纯粹的表达式,它看起来会更复杂。
关于c++ - 如果我不修改它,我不应该通过引用传递指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356348/