Анализ ваших попыток
MyObject ModifyObject(MyObject object)
Для этого потребуется как минимум копия объекта.Не идеально, когда вы можете избежать этого.
MyObject ModifyObject_constref(const MyObject & object)
Снова вам нужно скопировать параметр в возвращаемый объект.Та же проблема.
std::shared_ptr<MyObject> ModifyObject_ptr(const std::shared_ptr<MyObject> & object_ptr)
Нет, нет, нет, нет ... Нет!shared_ptr
используется для управления временем жизни ресурса, когда несколько объектов с разным временем жизни являются владельцами ресурса.Это его использование.Период.Если у вас нет такой ситуации, не используйте shared_ptr
.Более того, shared_ptr
оказывает очень значительное влияние на производительность.Существует по крайней мере внешнее общее состояние и 2 косвенные ссылки, связанные с shared_ptr
.
MyObject && ModifyObject_rvalue(MyObject object)
// ...
return std::move(object);
Неопределенное поведение!Вы возвращаете ссылку на аргумент функции.object
заканчивает свое время жизни, когда функция завершается, вы получаете ссылку на мертвый объект.Также в вашем случае перемещение эквивалентно копированию.В MyObject
нет ресурса, который можно было бы украсть за ход, поэтому ход фактически выполняет копирование.
Решение
Как показало Jarod42
MyObject& ModifyObject(MyObject& object)
Самый быстрый, потому что вы просто передаете ссылки.Новые объекты не создаются, копирование не производится.
Обязательно, возвращаемое значение.В идеале, аргумент const
Если у вас есть аргумент const, и вам нужно вернуть измененный объект, то вам, безусловно, нужно создать новый объект, и это включает в себя копию.Если это ваше требование, то я бы выбрал:
MyObject ModifyObject_1(MyObject object)
{
if (!object.ShouldNotChange)
object.SomeData[1] = 1;
return object;
}
или
MyObject ModifyObject_2(const MyObject& object)
{
MyObject r{object};
if (!r.ShouldNotChange)
r.SomeData[1] = 1;
return r;
}
или
MyObject ModifyObject_3(const MyObject& object)
{
if (object.ShouldNotChange)
return object;
MyObject r{object};
r.SomeData[1] = 1;
return r;
}
Какой из них самый быстрый?Ну, вам нужно профиль , что вы должны сделать в любом случае.Не делайте выводов из сборки, если они не подкреплены профилированием.Для кода, критичного к производительности профиль, профиль, профиль !
Функциональное программирование и производительность
В чистый функциональный код (это то, что вам нужно) все объекты неизменны.Это подразумевает копию всякий раз, когда вам нужно изменить объект.Это влияет на производительность.Вам нужно решить, стоит ли компромисс.