Информация об изменениях

Сообщение Re[38]: А С++ то схлопывается... от 21.11.2019 15:21

Изменено 21.11.2019 15:22 vdimas

Re[38]: А С++ то схлопывается...
Здравствуйте, dsorokin, Вы писали:

D>В Rust move — это обычно всего лишь копирование битов из одного места памяти в другое. Потом для расположенного в памяти старого объекта не будет вызван деструктор (он называется Drop), и все. А многие объекты (векторы, умные указатели, срезки, строки, реализующие классы типов объекты) имеют такое представление в памяти, что их достаточно просто взять и скопировать побитого во время move.


Вообще, move-семантика изначально была нужна для unique_ptr.
А этот кейз оптимизатор компилятора отрабатывает хорошо, бо обычно вызов деструктора идёт сразу за вызовом move.
Т.е. идёт примерно такая последовательность операций с полем-указателем unique_ptr (допустим, используется дефолтный deleter):
ptr_ = nullptr;
if(ptr_) delete ptr_;


Если переменная uiniwue_ptr была локальной, то в бинарнике ничего этого нет, т.е. ни присвоения nullptr, ни ветвления.

Сделай ревью своему коду на предмет локальности.

И да, std::function — не самый эффективный механизм, бо runtime-абстракции не бесплатны.
Выгодней иметь типизированный функтор или лямбду, подаваемые в шаблонные ф-ии.
Re[38]: А С++ то схлопывается...
Здравствуйте, 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-абстракции не бесплатны.
Выгодней иметь типизированный функтор или лямбду, подаваемые в шаблонные ф-ии.