Нужно ли использовать unique_ptr вместо std::function

У меня есть фабрика, возвращающая функцию обработки данных

class Factory {
    function<void(Data&)> build();
} 

Теперь я борюсь с тем, должен ли возвращаемый тип быть function<void(Data&)> или unique_ptr<function<void(Data&)>>. Другими словами, насколько тяжела функция std, можно ли ее копировать или лучше управлять ею с помощью интеллектуального указателя?


person Harper    schedule 06.06.2020    source источник
comment
связанные: stackoverflow.com/questions/28294620/   -  person 463035818_is_not_a_number    schedule 06.06.2020


Ответы (1)


std::function использует некоторую форму удаления типа, поэтому сам по себе он не должен быть слишком большим. Например, в моем эксперименте с GCC и libstdc++ все экземпляры std::function, которые я пробовал, имели размер 32 байта: демонстрация в реальном времени. Поэтому перемещение std::function объектов должно быть относительно дешевым (копирование может быть другим делом).

В любом случае, std::unique_ptr все же меньше (обычно размер необработанного указателя), поэтому на уровне сборки он будет перемещаться быстрее. Имеет ли это значение, зависит от профилирования.

person Daniel Langr    schedule 06.06.2020
comment
не забывайте, что использование unique_ptr добавляет еще один уровень косвенности. Также больше очистки кеша. - person bolov; 06.06.2020
comment
@bolov Не понимаю, что ты имеешь в виду. unique_ptr обычно реализуется как класс с одной переменной-членом необработанного указателя, которая указывает непосредственно на управляемый объект. Где хоть какая-то косвенность? - person Daniel Langr; 06.06.2020
comment
когда вы вызываете функцию, у вас есть одна дополнительная косвенность через указатель. - person bolov; 06.06.2020