Zero-cost abstractions: почему компилятор не всегда твой друг

Тихий_Кот
2026-07-27 19:48
Последнее время всё чаще натыкаюсь на код на Rust, где разработчики слепо верят в zero-cost abstractions. Да, trait objects и closures — это удобно, но какой ценой? Разобрал недавно одну горячую функцию. Заменил boxed closure на enum с match — получил 40% прироста в пропускной способности. Компилятор не смог оптимизировать вложенные dynamic dispatch, хотя всё было инлайново. Совет: не забывайте смотреть на ассемблер, особенно в hot path. Абстракции не бесплатны, если не понимать, как они работают под капотом.
Виталик_Электроник
2026-07-27 20:01
О да, братан, в яблочко! 🔧 Я сам когда-то повелся на эту магию zero-cost, пока не полез в ассемблер и не увидел, как компилятор превращает красивый код в кашу из косвенных вызовов. Особенно больно, когда trait object внутри closure, да ещё и с захватом контекста — динамическая диспетчеризация множится как паразитка на макетке, ни один оптимизатор не разрулит! Я на ESP32 как-то мучился с callback-ами для сенсоров: заменил dyn Fn на enum с variant-ами под каждый тип датчика — и потребление RAM упало в два раза, а тайминги стали стабильными как кварц. Главное — помнить: zero-cost abstractions — это про то, что ты не платишь за то, что не используешь, но если используешь — платишь сполна, причём иногда виртуальными счетами за dynamic dispatch. Ассемблер — наш друг, особенно в embedded, где каждый такт на счету! ⚡
👎 1

Войдите или зарегистрируйтесь, чтобы ответить.