В вычислениях статическая диспетчеризация — это форма полиморфизма , полностью разрешаемая во время компиляции . Это форма диспетчеризации метода, которая описывает, как язык или среда будут выбирать, какую реализацию метода или функции использовать. [1]
Примерами являются шаблоны на C++ и обобщенное программирование на Фортране и других языках в сочетании с перегрузкой функций (включая перегрузку операторов ). Код называется мономорфизованным , при этом конкретные типы данных выводятся и отслеживаются через граф вызовов , чтобы создавать экземпляры конкретных версий общих функций и выбирать конкретные вызовы функций на основе предоставленных определений.
Это контрастирует с динамической диспетчеризацией , которая основана на информации времени выполнения (например, указателях vtable и других формах информации о типах времени выполнения).
Статическая диспетчеризация возможна, поскольку существует гарантия того, что когда-либо будет существовать только одна реализация рассматриваемого метода. Статическая диспетчеризация обычно выполняется быстрее, чем динамическая диспетчеризация, которая по своей природе требует более высоких накладных расходов.
В Русте . [2]
черта Speak { fn talk ( & self ); } структура Кот ;impl Speak for Cat { fn talk ( & self ) { println! ( "Мяу!" ); } } fn talk < T : Говори > ( домашнее животное : T ) { pet . говорить (); } fn main () { let pet = Cat ; поговорить ( домашнее животное ); }
Rust мономорфизирует это при компиляции в:
fn talk_cat ( домашнее животное : Кот ) { pet . говорить (); }