Здравствуйте, dsorokin, Вы писали:
D>В Rust move — это обычно всего лишь копирование битов из одного места памяти в другое. Потом для расположенного в памяти старого объекта не будет вызван деструктор (он называется Drop), и все. А многие объекты (векторы, умные указатели, срезки, строки, реализующие классы типов объекты) имеют такое представление в памяти, что их достаточно просто взять и скопировать побитого во время move.
Вообще, move-семантика изначально была нужна для unique_ptr. ))
А этот кейз оптимизатор компилятора отрабатывает хорошо, бо обычно вызов деструктора идёт сразу за вызовом move.
Т.е. идёт примерно такая последовательность операций с полем-указателем unique_ptr (допустим, используется дефолтный deleter):
ptr_ = nullptr;
if(ptr_) delete ptr_;
Если переменная uinique_ptr была локальной, то в бинарнике ничего этого нет, т.е. ни присвоения nullptr, ни ветвления.
Сделай ревью своему коду на предмет локальности.
И да, std::function — не самый эффективный механизм, бо runtime-абстракции не бесплатны.
Выгодней иметь типизированный функтор или лямбду, подаваемые в шаблонные ф-ии.