返回静态本地引用

时间:2012-02-03 18:56:26

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

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

Large large()
{
    return Large();
}

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

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

它应该按预期工作,但是即使它是const限定的,返回对静态局部的引用是不好的风格吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

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