12

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

如果我有一个指向对象的指针,比如说Object *ptr;,我想将它传递给void foo(Object& obj)我理解我需要编写的表单的方法:

foo(*ptr);

但为什么要取消引用ptr?只是通过它没有意义foo(ptr);吗?我担心*ptr可能会复制原始对象,或者至少不只是传递到要foo使用的地址。

谁能帮我解决这个问题?是否通过了潜在的瓶颈,因为代码期望它的行为与函数被调用*ptr时一样快?void foo(Object *obj);foo(ptr)

4

5 回答 5

14

我担心 *ptr 可能会复制原始对象。

你错了。取消引用指针不会产生任何副本!

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

Object *ptr = get();

foo(*ptr); 

在这段代码的最后一行没有副本。该标准为您提供了这样的保证。

但是,如果按 valuef取参数,那么就会有副本。

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

于 2013-01-07T10:07:11.193 回答
13

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

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

于 2013-01-07T10:09:36.870 回答
1

通过引用传递对象只是传递指针,因此 foo(*ptr) 是正确的并且不会复制对象。为什么要取消引用它?因为函数签名需要一个对象,而不是指向对象的指针。C++ 是一种强类型语言。

于 2013-01-07T10:09:01.253 回答
0

要传递对函数的引用,您必须像在值语义中那样传递对象。指针不是引用,因为它们是实体语义(地址)。

如果你取消引用一个指针,你会得到一个可以作为引用嵌入的实际值。

于 2013-01-07T10:09:31.407 回答
0

引用和指针是一样的。但是引用有其自身的优势,那就是它们不能为空(虽然它们可以,但创建一个空引用有点困难),因此您可以省略对 nullptr 的检查。您可以使用 。而不是 -> 是一个较短的字符 xD。关于您的问题,因为指针是引用,所以最终选择一个而不是另一个不会有任何收益。我的意思是下面的代码在编译时是相同的。

void foo(int &r) {}

void foo(int *p) {}

当您使用引用时,后台将取消引用。希望它有所帮助。

于 2013-01-07T10:23:46.217 回答