【问题标题】:c++ passing by const pointer or reference to const pointerc++ 通过 const 指针传递或引用 const 指针
【发布时间】:2018-04-12 04:45:26
【问题描述】:

我正在学习 c++,最近我读了一本书,其中建议您应该尽可能使用对 const 的引用(如果不会更改基础对象)。

我有一个问题,如果可能的话,您是否应该将引用传递给 const 指针而不是 const 指针,因为引用会阻止复制。如果不是,我什么时候应该使用对 const 指针的引用。

例如:

Node(..., Node *const next = nullptr);

Node(..., Node* const& next = nullptr);

【问题讨论】:

  • 可能永远不会。
  • 当您编写一个不知道其模板参数是否为指针的模板时,您可能会使用对指针的引用。否则,使用对指针的引用既尴尬又低效。
  • 通过引用传递是有意义的,但是对于智能指针,如果不是原始指针,以避免增加引用计数。

标签: c++ constants pass-by-reference pass-by-pointer


【解决方案1】:

当按值传递(导致参数复制)是一项繁重的操作时,通过 const 引用传递是一种很好的做法。

例如,当您将具有某些属性的类传递给函数时,最好通过 const 引用传递它,另一方面,如果您要传递 int 之类的类型或仅传递指针,则最好不要使用引用,因为那样由于取消引用过程,您会失去性能。

【讨论】:

  • 因此,如果我将引用传递给指针,我会阻止复制(就像普通引用一样),但会受到性能损失,如果我只通过指针传递,我可能会因复制而受到小幅损失,但会提高性能, 正确的 !非常感谢
  • 没错,通过const & 只是为了确保您不会错误地更改它,如果您这样做编译器会抱怨(当您决定使用通过引用传递的好处时,这是一个好习惯因为use const wherever possible),所以和普通引用完全一样,有这个限制。
【解决方案2】:

由于引用本质上是指针,因此通过引用传递指针并没有性能提升。

【讨论】:

  • 不仅仅是“没有性能提升”,恰恰相反——你最终会得到一个双重间接。
  • 你会通过非常量引用传递一个指针来改变它的值,这是我唯一一次这样做。
【解决方案3】:

如果您的意图是修改指针值,您只会使用对指针的引用。例如:

ErrorCode MakeSomeObjectForMe(Object *&ptr) {
    if (badPreCondition) {
        return SomeSpecificError;
    }
    ptr = new Object();
    return Succuess;
} 

// Use ptr outside the function.

否则这不是一个好主意,因为它可能会通过双重间接降低性能。因此,您可能从不const & 传递给指针。

【讨论】:

  • OP 询问了关于 const & 指向指针的问题,而不仅仅是引用指针,所以你答案的第一部分有点无关紧要,因为当它保持不变时你不能改变它。
  • @Hamed,我正在概述为什么您会引用指针。然后我说:Otherwise it is not a good idea because it may cost you in performance through double indirection. So you will likely never pass a const & to a pointer. 哪个回答了这个问题。如果你想让它更好地编辑答案。如果我同意,我会批准。
  • 我没有说你没有回答这个问题,你所说的一切都是正确的,我只提到了你问题的第一部分,它是正确的,但这不是 OP 所问的。
  • @Hamed 我认为概述指针引用的目的是回答这个问题的重要部分。
  • 嗯...,也许,所以+1
【解决方案4】:

作为一个例子,在并发编程中,将 ref 传递给 const ptr 到工作线程可以用作一种通信方式; ptr 可能实际上不是 const。

mutex sync;
void task(int*const&);
int main(){
    int *paramptr=nullptr;
    thread woker{task,paramptr};
    sync.lock();
    paramptr=whatever;
    sync.unlock();
    worker.join();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多