假设我有两个功能
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);
由于
答案 0 :(得分:0)
不,ProcessData(*p)
不会将*p
复制到堆栈或其他任何位置。它直接通过了。
您可以将日志记录添加到复制/更多构造函数/赋值运算符并查看自己。
答案 1 :(得分:0)
取消引用指针的结果是左值。该左值绑定到函数的左值引用参数。没有副本,因为副本是(物化的)prvalues,并且函数调用的任何部分都不需要glvalue到prvalue的转换。