Re[37]: А С++ то схлопывается...
От: dsorokin Россия  
Дата: 19.11.19 18:41
Оценка: 1 (1)
Здравствуйте, so5team, Вы писали:

S>Здравствуйте, dsorokin, Вы писали:


D>>Скорее всего, это больше говорит о моих еще далеко несовершенных знаниях C++, где я чего-то еще недопонимаю, но мне такой расклад очень запомнился.


S>Ну прямо классика: "Ложечки-то нашлись, но осадочек остался."


Нет. Увы! Мне сейчас кажется, что C++ в такой задаче не может догнать Rust в силу особенностей того, как работает move в Rust и C++. Очень хотел бы ошибиться.

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

Если брать C++, то для тех же std::function последние нужно компилятору явно обнулить, чтобы потом у перенесенного объекта корректно сработал деструктор, т.е. здесь C++ выполняет лишнюю работу, которую Rust не делает, потому что Rust так спроектирован.

Более того, пишут в интернетах, что для C++ копирование может даже оказаться дешевле, чем move. Еще там исключения ошиваются рядом. Короче, опечалился, потому что это важно для моей задачи.

Тут такая штука любопытная вырисовывается. В C++ основным является копирование объектов, хотя и необязательным, тогда как move сделан был уже позже. В Rust же основным является move, язык на это заточен с самого начала, а вот копирование в Rust должно быть всегда явным. В терминах Rust это более корректно назвать "клонированием". Так называемое "копирование" тоже есть, но оно является частным случаем клонирования, когда можно уже побитового скопировать, сохранив идентичность старого объекта (числа, например). Итого получатся, что move в Rust обычно намного дешевле, чем копирование.

Короче, печаль в моих глазах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.