меня есть Vec<T>, на котором определены куча методов.
Все они уже скомпилированы в бинарь и лежать под боком у rustc.
У меня есть тип Foo, на котором реализован типаж Ord, и я вызываю на Vec<Foo> метод .sort().
Внутри себя сорту нужно вызвать соответствующую реализацию .cmp()
Вопрос: откуда сорт в уже скомпиленном бинаре std знает, где именно лежит нужная cmp()? (Т.е. по какому адресу нужно прыгать?)
Вроде бы, растбук утверждает, что dynamic dispatch здесь не используется.
vtable?
Т.е. static dispatch через vtable?
Так ведь где лежит cmp известно для Foo
Это на примерно на уровне HIR происходит,и мне понятно. Мне непонятно, что происходит при кодгене -- как адреса методов узнать и в уже скомпиленный крейт положить?
Баунд это буквально ограничения на типы, где перечислены методы и прочее. Компилятор находит нужный impl блок для типа Foo и оттуда получает функцию
Для генериков компилятор автоматически экспортирует что-то вроде C++ хидера. В итоге код сортировки будет скомпилирован в машинный код в твоей единице трансляции, а не в STD.
А какое из? HIR или MIR?
Достаточное для сборки
Обсуждают сегодня