Сравните следующие два фрагмента кода, первый с использованием ссылки на большой объект, а второй имеет большой объект в качестве возвращаемого значения. Акцент на "большой объект" относится к тому факту, что повторные копии объекта, без необходимости, являются потерянными циклами.
Использование ссылки на большой объект:
void getObjData( LargeObj& a )
{
a.reset() ;
a.fillWithData() ;
}
int main()
{
LargeObj a ;
getObjData( a ) ;
}
Использование большого объекта в качестве возвращаемого значения:
LargeObj getObjData()
{
LargeObj a ;
a.fillWithData() ;
return a ;
}
int main()
{
LargeObj a = getObjData() ;
}
Первый фрагмент кода не требует копирования большого объекта.
Во втором фрагменте объект создается внутри функции, и, как правило, при возврате объекта требуется копия. В этом случае, однако, в main()
объект объявляется. Будет ли компилятор сначала создавать объект, построенный по умолчанию, а затем скопировать объект, возвращенный getObjData()
, или он будет таким же эффективным, как первый фрагмент?
Я думаю, что второй фрагмент легче читать, но я боюсь, что он менее эффективен.
Изменить: Обычно я рассматриваю случаи LargeObj
как универсальные классы контейнеров, которые для аргумента содержат тысячи объектов внутри них. Например,
typedef std::vector<HugeObj> LargeObj ;
поэтому непосредственное изменение/добавление методов к LargeObj
не является прямым решением.