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

时间:2013-01-07 10:03:52

标签: c++ c++11

  

可能重复:
  How expensive is it to dereference a pointer in C++?

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

foo(*ptr);

但为什么要解除引用ptr?传递它foo(ptr);是否有意义?我担心*ptr可能会对原始对象进行复制,或者至少不只是传递给foo地址来使用。

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

5 个答案:

答案 0 :(得分:12)

  

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

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

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

Object *ptr = get();

foo(*ptr); 

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

但是,如果f通过值获取参数,那么复制。

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

答案 1 :(得分:12)

传递*ptr是否确实复制取决于被调用函数是否需要ObjectObject &

在前一种情况下,将制作副本。在后一种情况下(即你的情况),没有副本。

答案 2 :(得分:0)

参考文献和指针是相同的。但是引用有它们自己的优点,那就是它们不能为空(虽然它们可以但是很难做出空引用)所以你可以省略对nullptr的检查。您可以使用 。而不是 - >这是一个较短的字符xD。关于你的问题,因为指针是引用是相同的,最终将没有任何收益选择一个而不是另一个。我的意思是编译后的代码是相同的。

void foo(int &r) {}

void foo(int *p) {}

当您使用引用时,将在后台进行解除引用。 希望它有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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