【问题标题】:Does passing by const reference really save the memory cost when it has to convert the type?当必须转换类型时,通过 const 引用传递是否真的节省了内存成本?
【发布时间】:2021-06-25 10:02:18
【问题描述】:

关于const 参考(参考 const)存在许多问题。但是当有隐式转换时,const 引用也会导致一个新地址。我在下面写了这个例子:

int i = 42;     
double d = 4.2;     
const int& ri1 = i;     
const int& ri2 = d;

&ri1&i 会打印相同的地址,但是 &ri2&d 是不同的。 ri2 真正服务的对象是什么?正如“C++ Primer”所说,它会生成一个临时对象。但是如果转换后的 const 引用使用了不同的地址,这意味着这个地址仍然有一个有效的对象。

假设我有一个很长的stringconst char* 作为“长示例文本”并将其传递给某个接受const string& 的函数,会有类似的转换。

【问题讨论】:

  • const int& ri2 = d; 会创建一个临时的int,并延长生命周期。

标签: c++ memory-management const-reference


【解决方案1】:

这样思考会很有帮助:

如果此绑定会导致此对象发生更改,我们不希望将 (plain) & 引用绑定到该对象。例如。从 3.1415 到 3,像这里:

double pi = 3.1415; 
int& r = pi; // Imagine, now both r and pi are 3...

我们不能将r 的类型更改为double (否则,这对于该语言来说将是一个相当大的逻辑!)

而且我确信大多数 C++ 用户不希望将引用的 pi 的值更改为 3(因为 rint),这只是引用绑定的结果。

我们需要通过将pi 转换为r 的类型来创建一个新对象。当我们发生转换时,引用将绑定到由于此转换而创建的临时对象。

没有理由让非const 引用我们没有其他(引用“句柄”除外) 访问的未命名对象。如果我们出于某种原因想要更改它,我们可以将pi 复制到int i 并将i 更改为我们想要的任何内容。

回答你问题的关键点:

是的,如果是from const char* to const string&,会增加额外负担,不过大概是不是const string& 的预期用途。

为什么?因为如果您确定知道,例如,您的函数将被传递一个const char*(并且只有它)并且您无法承受任何开销,那么您为什么要声明像const string& 这样的参数。 嗯,可能有几个正当的理由,所有这些理由都​​值得付出开销

在其他情况下,当传递string 时,您将避免复制。双赢的局面,不是吗?

【讨论】:

    【解决方案2】:

    确实有一个未命名的 int 对象,值为 4。这需要一些内存。

    对于std::string 示例,const string& 可以绑定到string 参数而不会导致复制。但是const char* 参数会导致复制。你可以考虑std::string_view

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 2017-04-13
      • 2011-11-02
      • 2022-01-19
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多