返回对象作为函数结果

时间:2014-09-05 15:02:39

标签: c++

我可以将ggg函数中创建的字符串返回到h变量,还是可能已经被销毁?

std::string ggg()
{

    std::string g = "blabla" ;
    return g;

}


int main( int argc, char ** argv )
{
    std:string h = ggg();
}

3 个答案:

答案 0 :(得分:1)

是的,你可以做到。价值将被复制。

编辑。 现代聪明的编译器也可以使用移动语义,你可以在其他答案中读到这个:)

答案 1 :(得分:1)

是的,你可以,它不会被破坏,它将被复制或移动。至于这两者将会发生什么,取决于ggg()被引发的背景。

例如,如果您按下面所示调用它:

std:string h = ggg();

std::string中返回的ggg()将被删除/移动。

如果您按下面的说法调用它:

std::string h;
...
h = ggg();

返回的值将被复制到h

答案 2 :(得分:1)

您可以毫无问题地返回,这是正确的代码。

C++98中,建议不使用复杂或大对象执行此操作因为会被复制并且性能受到影响(额外的副本)。在有问题的特定情况下,编译器几乎可以确定副本(请参阅RVO以了解原因,注意:真正的旧编译器没有这种优化)。但是在更复杂的代码中(例如:更复杂的函数体,更多的返回语句等等),即使返回相同类型(std::string),也无法应用优化(这在性能敏感代码中是一种杀戮)。

如果编译器可以确定不再使用该值(例如:将被超出范围销毁,如此情况和许多其他情况),则C++11会更好,并且会优化值被移动(通常更高效的复制注意:有时复制与移动一样高效,例如:只有POD成员的类) 。在返回std::string的特定情况下,移动将是(在大多数STL实现中)一些指针的副本。

在有问题的特定情况下,很可能与C++98C++11中生成的代码相同。

C++11这种情况下,如果是Move Semantic的完美示例。