假设我有一个函数将返回一个大型数据结构,目的是调用者将立即复制返回值:
Large large()
{
return Large();
}
现在假设我不想依赖任何类型的编译器优化,例如返回值优化等。还假设我不能依赖于C ++ 11移动构造函数。我想就以下代码的“正确性”收集一些意见:
const Large& large()
{
static Large large;
large = Large();
return large;
}
它应该按预期工作,但是即使它是const限定的,返回对静态局部的引用是不好的风格吗?
答案 0 :(得分:4)
这完全取决于应该按预期工作的含义。在这种情况下,所有调用者将共享对完全相同变量的引用。另请注意,如果调用者将复制,那么您实际上是禁用RVO(返回值优化),将在所有当前编译器 [*] 中运行。
我会尽可能远离这种方法,这不是惯用的,在很多情况下可能会引起混淆。
[*] 我所知道的所有编译器中的调用约定确定返回 large (即不适合寄存器)变量的函数接收隐藏指针到调用者为变量分配空间的位置。也就是说, optization 是由调用约定强制的。
答案 1 :(得分:3)
我认为这样做没有任何问题。只要这个代码库是,并且将永远是单线程的。
在多线程代码上执行此操作,您可能永远无法弄清楚为什么您的数据偶尔会被随机损坏。