Подтвердить что ты не робот

Когда следует использовать inline в Rust?

Rust имеет атрибут "inline", который можно использовать в одном из этих трех вариантов:

#[inline]

#[inline(always)]

#[inline(never)]

Когда они должны использоваться?

В ссылке Rust мы видим секцию встроенных атрибутов, говоря

Компилятор автоматически устанавливает функции, основанные на внутренних эвристиках. Неправильно встроенные функции могут сделать программу более медленной, поэтому ее следует использовать с осторожностью.

В форуме внутренних ресурсов Rust huon также был консервативным относительно указания встроенного.

Но мы видим значительное использование в источнике Rust, включая стандартную библиотеку. Множество встроенных атрибутов добавляются к однострочным функциям, что должно быть легко для компиляторов определить и оптимизировать с помощью эвристики в соответствии с эталоном. Действительно ли они не нужны?

4b9b3361

Ответ 1

Одно ограничение текущего компилятора Rust заключается в том, что если вы не используете LTO (Оптимизация времени соединения), он никогда не будет встроить функцию, не помеченную #[inline] для ящиков. Rust использует отдельную модель компиляции, подобную С++, поскольку реализация LLVM LTO не очень хорошо масштабируется для крупных проектов. Таким образом, небольшие функции, открытые для других ящиков, должны быть отмечены вручную. Это не очень хорошая ситуация, и, вероятно, она будет исправлена ​​в будущем с помощью некоторой комбинации улучшений в разработке LTO и MIR.

#[inline(never)] иногда полезен для отладки (отделяя кусок кода, который работает не так, как ожидалось). Теоретически это можно использовать для бенчмаркинга, но обычно это плохая идея: отключение вставки не предотвращает другие межпроцедурные оптимизации, такие как постоянное распространение. С точки зрения нормального кода, он может уменьшить кодировку, если у вас есть часто используемая вспомогательная функция, которая используется только для обработки ошибок.

#[inline(always)], как правило, плохая идея; если функция достаточно велика, что компилятор не будет встроить ее по умолчанию, она будет достаточно большой, чтобы накладные расходы на вызов не имели значения (а чрезмерная инкрустация увеличивает давление кэша команд). Есть исключения, но для его оправдания требуются измерения производительности. https://github.com/rust-lang/rust/commit/274bb24efdbeed0ab1a91f3c02f86551ef16eac7 - такая ситуация, когда это стоит рассмотреть. #[inline(always)] также может использоваться для улучшения качества кода -O0, но об этом обычно не стоит беспокоиться.