Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 487новых вакансий за сутки·92 551вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 763
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 240
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США43 685
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 887
  • Релокация в США43 685
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме RustВсе вопросы
RustMiddleТеория

Что такое trait object (dyn Trait) и в чём разница между static dispatch и dynamic dispatch?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Static dispatch (impl Trait / generics) компилятор разворачивает в отдельные копии функции для каждого конкретного типа — нет накладных расходов в рантайме. Dynamic dispatch (dyn Trait) хранит fat pointer (данные + vtable) и разрешает вызов метода в рантайме через указатель на таблицу виртуальных функций.

Static dispatch — monomorphization

Когда вы пишете обобщённую функцию с trait bound, компилятор создаёт отдельную копию для каждого конкретного типа. Это называется monomorphization:

fn print_area<T: Shape>(shape: &T) {
    println!("area = {}", shape.area());
}

trait Shape {
    fn area(&self) -> f64;
}

struct Circle { radius: f64 }
struct Rect { w: f64, h: f64 }

impl Shape for Circle {
    fn area(&self) -> f64 { std::f64::consts::PI * self.radius * self.radius }
}
impl Shape for Rect {
    fn area(&self) -> f64 { self.w * self.h }
}

fn main() {
    // Компилятор генерирует print_area_Circle и print_area_Rect
    print_area(&Circle { radius: 3.0 });
    print_area(&Rect { w: 4.0, h: 5.0 });
}

Вызов метода shape.area() разрешается на этапе компиляции — это обычный прямой вызов функции. Нулевые накладные расходы в рантайме, компилятор может инлайнить.

Dynamic dispatch — dyn Trait и vtable

Trait object &dyn Shape или Box<dyn Shape> — это fat pointer: два указателя по 8 байт каждый.

  • data pointer — указатель на сами данные объекта.
  • vtable pointer — указатель на таблицу виртуальных функций конкретного типа.

Vtable содержит: размер типа, выравнивание, указатель на drop, и указатели на каждый метод трейта в том порядке, в котором они объявлены.

fn print_area_dyn(shape: &dyn Shape) {
    // Вызов через vtable: *(shape.vtable.area)(shape.data)
    println!("area = {}", shape.area());
}

fn main() {
    let shapes: Vec<Box<dyn Shape>> = vec![
        Box::new(Circle { radius: 3.0 }),
        Box::new(Rect { w: 4.0, h: 5.0 }),
    ];
    for s in &shapes {
        print_area_dyn(s.as_ref());
    }
}

Сравнение: когда что использовать

  • Static dispatch: предпочтителен по умолчанию. Ноль накладных расходов, возможность инлайнинга, лучшая оптимизация. Недостаток: code bloat при большом числе типов и сложных дженериках.
  • Dynamic dispatch: нужен, когда набор типов не известен на этапе компиляции (плагины, heterogeneous collections, callback). Накладные расходы: один indirect call + потенциальный cache miss по vtable (~1–5 нс).

Object safety

Не каждый трейт можно использовать как dyn Trait. Трейт object-safe, только если:

  • Ни один метод не возвращает Self.
  • Ни один метод не имеет дженерик-параметра.
  • Трейт не требует Self: Sized.
trait NotObjectSafe {
    fn clone_self(&self) -> Self; // возвращает Self — нельзя dyn
}

trait ObjectSafe {
    fn describe(&self) -> String; // OK
    fn area(&self) -> f64;        // OK
}

impl Trait в позиции возвращаемого типа

// Статический диспатч: конкретный тип скрыт, но один
fn make_adder(x: i32) -> impl Fn(i32) -> i32 {
    move |y| x + y
}

// Динамический диспатч: может быть любой тип в рантайме
fn make_shape(circle: bool) -> Box<dyn Shape> {
    if circle {
        Box::new(Circle { radius: 1.0 })
    } else {
        Box::new(Rect { w: 2.0, h: 3.0 })
    }
}

Подводные камни

  • Code bloat: monomorphization создаёт копию функции для каждого типа. В крупных проектах это замедляет компиляцию и раздувает бинарь. Решение: использовать dyn Trait во внутренних вспомогательных функциях и публичную generic-обёртку сверху.
  • dyn Trait не реализует сам трейт: нельзя передать &dyn Shape туда, где ожидается T: Shape без явного враппера.
  • Размер dyn Trait не известен: нельзя хранить dyn Shape на стеке напрямую — только за указателем (&dyn, Box<dyn>, Arc<dyn>).
  • Send + Sync с dyn: чтобы Box<dyn Shape> было Send, нужно явно указать Box<dyn Shape + Send> — иначе компилятор откажет при передаче в поток.
  • Lifetime в dyn: по умолчанию dyn Trait имеет неявный lifetime 'static. При работе с заимствованными данными нужно dyn Trait + 'a.
  • Downcast: из dyn Trait нельзя получить конкретный тип без Any + downcast_ref. Архитектурно это признак плохого дизайна.
  • Производительность vtable: indirect call ломает branch prediction и inline cache процессора. В tight loops лучше static dispatch или enum dispatch.
  • enum dispatch как альтернатива: если набор типов конечен и известен, enum с вариантами часто быстрее dyn Trait и не требует аллокации на куче.

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Rust →

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/

Связанные темы

Rustrisk-analysisrust-productiontechnical-depth

Вакансии с этим навыком

Rust вакансии
  • Senior Flutter Developer (AI)
  • Senior Data Engineer (ETL / GCP)
  • Data Engineer (k/m/x)
  • Intermediate Backend Engineer, Authorization
  • Senior .Net Developer

Частые вопросы на собеседовании

  • Для каких задач Rust является сильным выбором, а где лучше честно выбрать другой язык?
  • Какие production-риски чаще всего возникают в проектах на Rust: производительность, зависимости, конкурентность, деплой или observability?
  • Как сравнить Rust с ближайшими альтернативами по производительности, поддерживаемости, найму и экосистеме?
  • Какие особенности runtime, type system или memory model Rust реально влияют на архитектуру приложения?