假设我有一个函数将返回一个大数据结构,目的是调用者将立即复制返回值:
Large large()
{
return Large();
}
现在假设我不想依赖任何类型的编译器优化,例如返回值优化等。还假设我不能依赖 C++11 移动构造函数。我想就以下代码的“正确性”收集一些意见:
const Large& large()
{
static Large large;
large = Large();
return large;
}
它应该按预期工作,但是即使它是 const 限定的,返回对静态本地的引用也是糟糕的风格吗?
最佳答案
这完全取决于应该按预期工作是什么意思。在这种情况下,所有调用者将共享对完全相同变量的引用。另请注意,如果调用者将复制,那么您实际上是在禁用 RVO(返回值优化),它将在所有当前编译器 [*] 中工作。
我会尽可能远离这种方法,它不是惯用的,在许多情况下可能会造成混淆。
[*]我所知道的所有编译器中的调用约定决定返回大(即不适合寄存器)变量的函数接收隐藏指针到调用者为变量分配空间的位置。也就是说,优化 是由调用约定强制执行的。
关于c++ - 返回静态本地引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133965/