【问题标题】:How do you pass an argument to a function when you only have its pointer? [duplicate]当你只有它的指针时,如何将参数传递给函数? [复制]
【发布时间】: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) 没有这样做,因为初始化引用不(在大多数情况下)涉及创建任何对象。

标签: c++ pointers reference


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 用你的 C++ 黄金,为什么不用我提供的欺骗而不是回答来锤击这个问题呢?*
    • @Jean-FrançoisFabre:因为我在回答问题时确实没有看到你的欺骗帖子......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2014-04-16
    • 2018-08-25
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多