C++ 返回静态本地引用

C++ 返回静态本地引用,c++,coding-style,static,reference,return-value,C++,Coding Style,Static,Reference,Return Value,假设我有一个返回大数据结构的函数,其目的是调用方立即复制返回值: Large large() { return Large(); } 现在假设我不想依赖任何类型的编译器优化,比如返回值优化等。同时假设我不能依赖C++11 move构造函数。我想就以下代码的正确性收集一些意见: const Large& large() { static Large large; large = Large(); return large; } 它应该按预期的方式工作,但

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

Large large()
{
    return Large();
}
现在假设我不想依赖任何类型的编译器优化,比如返回值优化等。同时假设我不能依赖C++11 move构造函数。我想就以下代码的正确性收集一些意见:

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

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

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


在一段多线程代码上执行此操作,您可能永远无法找出数据偶尔被随机损坏的原因。

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

在一段多线程代码上执行此操作,您可能永远无法找出数据偶尔被随机损坏的原因。

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

我将尽可能远离这种方法,因为它不是惯用的方法,在许多情况下可能会造成混乱

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

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

我将尽可能远离这种方法,因为它不是惯用的方法,在许多情况下可能会造成混乱


[*]据我所知,所有编译器中的调用约定都确定,返回较大(即不适合寄存器变量)的函数会收到一个隐藏指针,指向调用者为变量分配空间的位置。也就是说,选择是由呼叫约定强制执行的。

我不确定您想要实现什么。在您描述的假设中,第一种方法仍然是正确的。@Rob最终我想要返回引用的速度,而不需要调用方负责内存管理,也不需要对我的编译器进行假设。在这种情况下,不,您的第二个示例是不正确的。在large中有一个复制操作,我猜在large的调用者中有另一个。对于优化效果不佳的编译器,手动优化的代码不会比它所替换的代码快。在优化编译器的情况下,速度较慢。在这两种情况下,都很难保持好的观点。谢谢我不知道你想完成什么。在您描述的假设中,第一种方法仍然是正确的。@Rob最终我想要返回引用的速度,而不需要调用方负责内存管理,也不需要对我的编译器进行假设。在这种情况下,不,您的第二个示例是不正确的。在large中有一个复制操作,我猜在large的调用者中有另一个。对于优化效果不佳的编译器,手动优化的代码不会比它所替换的代码快。在优化编译器的情况下,速度较慢。在这两种情况下,都很难保持好的观点。谢谢