如何在C++中优化对象返回?

Leo*_*ele 2 c++ compiler-construction optimization return object

考虑下面的代码.

// Consider that MyObject receives three integers in it's constructor.
MyObject createObject()
{
    MyObject result(1, 2, 3);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

只要我知道,当你在C++中返回一个对象时(比如在这个函数中),编译器将在客户端的堆栈中创建一个新对象(作为局部变量).在这个例子中,它将是一个MyObject使用带有resultas参数的复制构造函数创建的新对象.这意味着对机器进行冗余处理:result将在堆栈中创建对象,然后创建并返回第二个对象.避免这种情况的另一种方法是动态创建对象(不在堆栈中),然后返回它的指针.但它会导致内存泄漏或强制客户端在使用后删除该对象.所以,我找到的解决方案是使用智能指针,如下所示:

// Consider that MyObject receives three integers in it's constructor.
boost::smart_ptr<MyObject> createObject()
{
    boost::smart_ptr<MyObject> result(new MyObject(1, 2, 3));
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但智能指针仍然是一个将被重新创建的对象(即使成本很低,因为它基本上只包含一个指针).我猜是否有办法更轻松地做到这一点; 或者如果编译器没有一种方法可以优化这项工作或类似的东西.是否有一种语法可以告诉编译器做我想要的事情?

Luc*_*ore 6

首先描述你的代码,我99%肯定没有复制的开销.

NRVO存在并且很可能在这种情况下起作用.

如果它不是用于复制省略,那么返回集合(如同std::vector等)会导致大量问题.

当你在C++中返回一个对象时(比如在这个函数中),编译器将在客户端的堆栈中创建一个新对象(作为局部变量).

并不是的.它可能会直接在调用上下文中创建,正好可以防止额外的副本.