class myObj
{
myObj() {};
}
myObj MakeObj()
{
return( myObj() );
}
main()
{
myObj o = MakeObj();
}
在 MakeObj 函数中,obj 是按值返回的。所以在赋值中,创建的对象被复制。似乎有两种操作 - 一种是创建对象并在 MakeObj 中分配其字段,另一种是在返回时复制对象。
编译器是否优化了这些步骤之一?
创建复杂对象并分配它的最快方法是什么?
class myObj
{
myObj() {};
}
myObj MakeObj()
{
return( myObj() );
}
main()
{
myObj o = MakeObj();
}
在 MakeObj 函数中,obj 是按值返回的。所以在赋值中,创建的对象被复制。似乎有两种操作 - 一种是创建对象并在 MakeObj 中分配其字段,另一种是在返回时复制对象。
编译器是否优化了这些步骤之一?
创建复杂对象并分配它的最快方法是什么?
从语义上讲,在 C++03 中,代码中有两个副本,即当它从 中返回时MakeObj()
,但第一个副本通常被编译器优化掉。该优化称为返回值优化。
在 C++11 中,返回的对象实际上是移动的(如果可用且可访问),而不是被复制的,它被编译器优化掉了。