Partager via


inline, __inline, __forceinline

Les spécificateurs d' inline et d' __inline indiquent au compilateur d'insérer une copie du corps de la fonction dans chaque emplacement que la fonction est appelée.

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

Notes

La mise en place (expansion inline appelée ou la fonctionnalité inline) se produit uniquement si le affichent de l'analyse coût-avantage du compilateur afin d'être rentable.L'expansion inline diminue la charge mémoire de fonction-appel au coût potentiel d'un plus grand nombre d'instructions.

Le mot clé d' __forceinline substitue l'analyse coût-avantage et repose sur un jugement du programmeur à la place.Avertissement de exercice lors de l'utilisation __forceinline.L'utilisation aveugle d' __forceinline peut entraîner le plus grand code avec uniquement des gains de performance ou, dans certains cas, même des pertes marginaux de performance (créées à la pagination accrue d'un plus grand fichier exécutable, par exemple).

Utilisation de fonctions inline peut rendre votre programme plus rapide car elles éliminent la surcharge associée à des appels de fonction.Les fonctions se sont développées inline sont soumises à des optimisations de code non disponibles aux fonctions normales.

Le compilateur traite les options d'expansion inline et les mots clés en tant que suggestions.Il n'y a aucune garantie que les fonctions seront inline.Vous ne pouvez pas forcer le compilateur à appliquer la fonctionnalité inline à une fonction particulière, même avec le mot clé d' __forceinline .Lors de la compilation avec /clr, le compilateur n'appliquera pas la fonctionnalité inline à une fonction s'il y a des attributs de sécurité appliqués à la fonction.

Le mot clé d' inline est disponible uniquement en C++.Les mots clés d' __inline et d' __forceinline sont disponibles dans C et C++.Pour compatibilité avec les versions antérieures, _inline est un synonyme de __inline.

Le mot clé d' inline indique au compilateur que l'expansion inline est favorite.Toutefois, le compilateur peut créer une instance séparée de la fonction (instancié) et créer des liaisons appelant standard au lieu d'insérer du code inline.Deux cas où cela peut se produire sont :

  • fonctions récursives.

  • Fonctions qui sont référencés par l'intermédiaire d'un pointeur ailleurs dans l'unité de traduction.

Ces raisons peuvent interférer avec la fonctionnalité inline, de même que peut d'autres, à la discrétion du compilateur ; vous ne devez pas dépendre du spécificateur d' inline pour rendre une fonction inline.

Comme avec les fonctions normales, il n'y a aucun ordre d'évaluation des arguments à une fonction inline.En fait, il peut être différent de l'ordre dans lequel les arguments sont évalués une fois passés à l'aide de le protocole d'appel de fonction normale.

L'option d'optimisation du compilateur de /Ob aide à déterminer si l'expansion de fonction inline se produit.

/LTCG exécute la fonctionnalité inline intermodule qu'il a été demandé dans le code source.

Exemple 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

Les fonctions membres d'une classe peuvent être déclarées inline à l'aide de le mot clé d' inline ou placer la définition de la fonction dans la définition de classe.

Exemple 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Spécifique à Microsoft

Le mot clé d' __inline équivaut à inline.

Même si __forceinline, le compilateur ne peut pas code incorporé dans toutes les circonstances.Le compilateur ne peut pas appliquer la fonctionnalité inline à une fonction si :

  • La fonction ou son appelant est compilée avec /Ob0 (l'option par défaut pour les versions debug).

  • La fonction et l'appelant utilisent différents types de gestion des exceptions (gestion des exceptions C++ dans une, la gestion structurée des exceptions dans l'autre).

  • la fonction a une liste d'arguments variable.

  • La fonction utilise l'assembly inline, sauf si compilé avec /Og, /Ox, /O1, ou /O2.

  • La fonction est récursive et non accompagné d' inline_recursion #pragma (en fonction).Avec le pragma, les fonctions récursives sont inline à une intensité par défaut 16 appels.Pour réduire la profondeur inline, pragma d' inline_depth d'utilisation.

  • la fonction est virtuelle et est appelée pratiquement.Les appels directs aux fonctions virtuelles peuvent être inline.

  • Le programme prend l'adresse de la fonction et l'appel à est effectué via le pointeur à la fonction.Les appels directs aux fonctions qui ont eu leur adresse prise peuvent être inline.

  • La fonction est également marquée avec le modificateur de naked__declspec .

Si le compilateur ne peut pas appliquer la fonctionnalité inline à une fonction déclarée avec __forceinline, il génère un avertissement de niveau 1.

Les fonctions récursives peuvent être inline substitué à une intensité spécifiée par le pragma d' inline_depth , jusqu'à un maximum de 16 appels.Après cette profondeur, des appels de fonction récursive sont traitées comme appels à une instance de la fonction.L'intensité à laquelle les fonctions récursives sont examinées par l'heuristique intégré ne peut pas dépasser 16.le pragma d' inline_recursion contrôle l'expansion inline d'une fonction actuellement sous l'expansion.Consultez l'option du compilateur pour expansion de fonction inline (/Ob) pour des informations connexes.

détail de FIN Microsoft

Pour plus d'informations sur l'utilisation du spécificateur d' inline , consultez :

Voir aussi

Référence

Mots clés C++

noinline

auto_inline