Здравствуйте, dsorokin, Вы писали:
D>Нет. Увы! Мне сейчас кажется, что C++ в такой задаче не может догнать Rust в силу особенностей того, как работает move в Rust и C++. Очень хотел бы ошибиться.
Не видя кода остается доверять только вашим словам о вашем небольшом знании C++. Я видел слишком много кода от новичков в C++, в котором локальные объекты создавались через new, а shared_ptr использовался направо и налево вне зависимости от его надобности и ненадобности.
В С++ очень легко получить просадку производительности. Например, используя такие невинные, на первый взгляд, вещи, как shared_ptr<T>{new T()}, или задействуя std::regex, или вызывая std::vector::push_back в цикле без предварительного reserve(), или даже применяя std::unordered_map в каких-то сценариях. Или написав return std::move(some_object).
В этом смысле показательно ваше упоминание std::function: если вы его активно используете для хранения лямбд с непустым списком захвата, то, вероятно, вы используете динамическую память сами того не подозревая.
Так что без кода ваши результаты можно списать как на проблемы C++, так и на радиус кривизны ваших рук (из-за недостатка опыта/знаний).