130 votes

Quand utiliser inline dans Rust?

La rouille a un "inline" attribut qui peut être utilisé dans l'un de ces trois saveurs:

#[inline]

#[inline(always)]

#[inline(never)]

Quand doivent-elles être utilisées?

Dans la Rouille de référence, nous voyons une ligne attributs de la section en disant:

Le compilateur automatiquement les fonctions inlines basé sur des heuristiques. De manière incorrecte inline fonctions peuvent effectivement rendre le programme plus lent, de sorte qu'il doit être utilisé avec précaution.

Dans la Rouille internes forum, huon a également été conservateur sur la spécification inline.

Mais nous voyons considérable de l'utilisation de la Rouille source, y compris de la bibliothèque standard. Beaucoup de inline attributs sont ajoutés à la ligne des fonctions, ce qui devrait être facile pour les compilateurs de repérer et d'optimisation grâce à des heuristiques selon la référence. Sont ceux, en fait, n'est pas nécessaire?

102voto

Eli Friedman Points 1389

Une limitation du courant de la Rouille compilateur est que si vous n'êtes pas à l'aide de LTO (Lien-Optimisation du Temps), il ne sera jamais incorporer une fonction non marqués #[inline] à travers les caisses. La rouille utilise un autre modèle de compilation similaire à C++ à cause de LLVM LTO mise en œuvre n'est pas à l'échelle de grands projets. Par conséquent, les petites fonctions exposées à d'autres caisses devront être marquées par la main. Ce n'est pas une bonne situation, et elle est susceptible d'être résolu dans l'avenir par une combinaison d'améliorations pour LTO et MIR inline.

#[inline(never)] est parfois utile pour le débogage (séparation d'un morceau de code qui ne fonctionne pas comme prévu). En théorie, il peut être utilisé pour l'analyse comparative, mais c'est généralement une mauvaise idée: la désactivation de l'in-lining n'empêche pas d'autres inter-procédurale des optimisations comme la constante de propagation. En termes de code, il peut réduire codesize si vous avez une méthode souvent utilisée en fonction d'assistance qui est utilisé uniquement pour le traitement des erreurs.

#[inline(always)] est généralement une mauvaise idée; si une fonction est assez grand pour que le compilateur ne pas l'inclure par défaut, il est assez grand que la surcharge de l'appel n'a pas d'importance (et l'excès de l'in-lining augmente cache d'instructions de pression). Il y a des exceptions, mais vous avez besoin de mesures de performance pour la justifier. https://github.com/rust-lang/rust/commit/274bb24efdbeed0ab1a91f3c02f86551ef16eac7 est le genre de situation où il est utile d'examiner. #[inline(always)] peut également être utilisé pour améliorer -O0 la qualité du code, mais ce n'est généralement pas la peine de s'inquiéter au sujet de.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X