将指针转换为参考,成本高昂?

Mr.*_*ith 10 c++ c++11

可能重复:
在C++中取消引用指针有多贵?

如果我有一个指向对象的指针,那么Object *ptr;我想把它传递给void foo(Object& obj)我理解我需要编写的形式的方法:

foo(*ptr);
Run Code Online (Sandbox Code Playgroud)

但为什么要解除引用ptr?通过它不是没有意义foo(ptr);吗?我担心*ptr可能会制作原始对象的副本,或者至少不仅仅是传递到foo地址来使用.

任何人都可以为我清除这个吗?是否传递*ptr了一个潜在的瓶颈,因为代码期望这个代码表现得像函数一样快void foo(Object *obj);并且通过调用foo(ptr)

Naw*_*waz 12

我担心*ptr可能正在复制原始对象.

你错了.取消引用指针不会进行任何复制!

void f(Object & obj); //note it takes the argument by reference

Object *ptr = get();

foo(*ptr); 
Run Code Online (Sandbox Code Playgroud)

在此代码的最后一行没有副本.标准为您提供保证.

然而,如果f需要的参数通过值,那么复制.

底线:函数参数中的引用用于避免复制(通常)或作为输出参数(偶尔)!


Dev*_*lar 12

传递*ptr是否复制取决于被调用函数是否需要一个Object或一个Object &.

在前一种情况下,将制作一份副本.在后一种情况下(即您的情况),不会复制.

  • @史密斯先生:没错.`ptr`是指向对象的指针.`*ptr`是指向的对象.到目前为止,没有人需要副本.将`*ptr`分配给***对象(`对象a`)需要一个副本.*引用*原始对象(通过`Object&a`)不会. (3认同)