【发布时间】:2018-06-23 13:52:50
【问题描述】:
假设我有两个函数
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);
对
ProcessDataInefficiently(*p);
谢谢
【问题讨论】:
-
不,您不是在制作副本。
-
这不是 C。C 没有引用
-
已经有足够多的正确答案了,但是添加了一个:
ProcessDataInefficiently(*p)确实执行了复制,但这并不是因为您写了*p。这是因为类类型函数参数data需要初始化,这意味着创建该类类型的新对象,在本例中使用复制构造函数。另一方面,ProcessData(*p)没有这样做,因为初始化引用不(在大多数情况下)涉及创建任何对象。