【问题标题】:Returning a Static Local Reference返回静态本地引用
【发布时间】:2012-02-03 18:56:25
【问题描述】:

假设我有一个函数将返回一个大型数据结构,目的是让调用者立即复制返回值:

Large large()
{
    return Large();
}

现在假设我不想依赖任何类型的编译器优化,例如返回值优化等。还假设我不能依赖 C++11 移动构造函数。我想就以下代码的“正确性”收集一些意见:

const Large& large()
{
    static Large large;
    large = Large();
    return large;
}

它应该可以按预期工作,但是即使它是 const 限定的,也返回对静态本地的引用是不是很糟糕?

【问题讨论】:

  • 我不确定您要完成什么。在您描述的假设中,第一种方法仍然是正确的。
  • @Rob 最后,我想要返回引用的速度,而不需要让调用者负责内存管理,也不需要对我的编译器做出假设。
  • 在这种情况下,没有你的第二个例子不是“正确的”。您在large() 中有一个复制操作,而我认为large() 的调用者中有另一个复制操作。在优化不佳的编译器的情况下,您手动“优化”的代码并不比它替换的代码快。在优化编译器的情况下,它更慢。无论哪种情况,都更难维护。
  • @Rob 好点。谢谢!

标签: c++ coding-style static reference return-value


【解决方案1】:

这完全取决于应该按预期工作的含义。在这种情况下,所有调用者将共享对完全相同变量的引用。另请注意,如果调用者将复制,那么您实际上是在禁用 RVO(返回值优化),这将在所有当前编译器中工作[*]

我会尽可能地远离这种方法,它不是惯用的,并且在很多情况下可能会引起混淆。

[*]我所知道的所有编译器中的调用约定确定返回 large(即不适合寄存器)变量的函数接收隐藏指针到调用者为变量分配空间的位置。也就是说,优化是由调用约定强制的。

【讨论】:

    【解决方案2】:

    我认为这样做没有任何问题。只要这个代码库是并且永远都是单线程的。

    在多线程代码上执行此操作,您可能永远无法弄清楚为什么您的数据偶尔会被随机损坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2012-11-05
      • 1970-01-01
      相关资源
      最近更新 更多