c++ - 如果我不修改它,我不应该通过引用传递指针吗?

标签 c++

在下面的代码中,我不应该通过引用传递 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/

相关文章:

c++ - 如何纠正对运算符优先级的错误假设以消除代码的副作用?

c++ - 如何知道 std::exception 的异常类型

c++ - 没有返回语句但编译并返回正确答案的函数

c++ - 类中未初始化字段的值

c++ - 访问冲突 Variadic 宏/函数 C++

c++ - 如何确保 Windows 和 Linux 上的浮点行为相同?

c++ - 在 Makefile 中组织项目并指定目标文件的目录

c++ - 在创建顶点着色器时需要帮助理解无效参数错误

c++ - 要从 Clion 的 C++ 项目中的 VCS 中删除哪些文件?

c++ - string s怎么改成char * a[]?