当你只有一个指针时,如何将参数传递给函数?

时间:2018-01-14 21:37:41

标签: c++ pointers reference

假设我有两个功能

void ProcessData(HugeDataStructure &data) { DoSomething(data); }
void ProcessDataInefficiently(HugeDataStructure data) { DoSomething(data); }

在我的代码中,我有一个指向数据的指针

HugeDataStructure *p = &SomeValidDataStructure;

当我调用函数

ProcessDataInefficiently(*p);

我相信我正在将(数据结构的)大量复制到堆栈上。另一方面,当我调用函数

ProcessData(*p);

我还在将数据副本复制到堆栈中吗?换句话说,是" * p"诱导副本?将此案例与以下案例进行比较

*p = AnotherValidDataStructure;

这里,我将AnotherValidDataStructure的内容复制到SomeValidDataStructure中,因此实际上是执行了一个副本。在传递需要引用的解除引用指针时,这是否成立?我很确定它没有,但无法找到相应的文档。

请不要进入"当你应该使用指针时,何时应该使用引用"讨论。我没有编写我需要调用的方法,所以它不在我的手中。我想确保在调用

时我没有在堆栈上制作大量副本
ProcessData(*p);

VS

ProcessDataInefficiently(*p);

由于

2 个答案:

答案 0 :(得分:0)

不,ProcessData(*p)不会将*p复制到堆栈或其他任何位置。它直接通过了。

您可以将日志记录添加到复制/更多构造函数/赋值运算符并查看自己。

答案 1 :(得分:0)

取消引用指针的结果是左值。该左值绑定到函数的左值引用参数。没有副本,因为副本是(物化的)prvalues,并且函数调用的任何部分都不需要glvalue到prvalue的转换。