История изменений
Исправление 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>(...)), а это копирование кода.