LINUX.ORG.RU

История изменений

Исправление den73, (текущая версия) :

Я уже несколько раз объяснил со ссылками на документацию. В момент преобразования типа от S к &T нужно создать новый объект:

That is, a trait object like &Foo consists of a ‘data’ pointer and a ‘vtable’ pointer.

Это и есть потеря - в С++ при одиночном наследовании объекта создавать не надо. Потеря у Rust тут небольшая (не нужно производить поиск), но она есть. Далее, в С++ один и тот же машинный код обслуживает S и все его потомки. В Rust, если ты хочешь работать с разными типами, реализующими трейт T, код foo(&object) придётся продублировать столько раз, сколько у тебя типов.

Но это мы ходим по кругу.

Исходная версия den73, :

Я уже несколько раз объяснил со ссылками на документацию. В момент преобразования типа от S к &T нужно создать новый объект:

That is, a trait object like &Foo consists of a ‘data’ pointer and a ‘vtable’ pointer.

Это и есть потеря - в С++ при одиночном наследовании объекта создавать не надо. Потеря у Rust тут небольшая (не нужно производить поиск), но она есть. Далее, в С++ один и тот же машинный код обслуживает S и все его потомки. В Rust, если ты хочешь работать с разными типами, реализующими трейт T, код foo(&object) придётся продублировать столько раз, сколько у тебя типов.

Но это мы ходим по кругу.

, то в Rust придётся применить шаблон, т.е. для работы с разными foo придётся писать foo<T>(...)), а это копирование кода.