C++返回本地对象

Bri*_*ian 16 c++

几个同事和我正在讨论当从C++方法返回局部变量(在堆栈上分配)时会发生什么.

以下代码适用于单元测试,但我认为这只是因为单元测试很幸运,并且不会尝试重用obj使用的堆栈上的内存.

这有用吗?

static MyObject createMyObject() {
    MyObject obj;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 24

发生的是复制构造函数被调用以制作本地对象的副本,这就是调用者接收的内容.

编译器可能会在名为copy elision的过程中删除副本,但这完全由编译器决定 - 您无法对其进行太多控制.

此模式能够产生您害怕的问题,但前提是您返回指向本地对象的指针引用.

  • "但只有在可观察到的影响是相同的情况下." - 不,复制省略的全部意义在于,即使复制品具有可观察到的副作用,也可以消除复制品,因此结果不一样.实现不需要特殊规则来执行*不会*改变可观察效果的代码转换,这可以在as-if规则下完成. (3认同)

Die*_*lla 5

obj 创建,然后使用对象的复制构造函数将其从方法/函数中复制出来。

您也可以obj通过声明它使其不在堆栈中static。返回对象也会返回一个副本,但不会在每次调用函数时创建对象。然后,您可以将对象作为引用返回:

static MyObject & createMyObject() {
    static MyObject obj;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

(这里没有副本,也obj只创建一次,它的地址在运行时保持不变)。