Maison >développement back-end >Tutoriel C#.Net >Inlining de fonction C
1. Remplacez le code macro par du code en ligne
Le langage C prend en charge l'inline de fonction, dont le but est d'améliorer l'efficacité d'exécution (vitesse) de la fonction.
Dans les programmes C, les codes macro peuvent être utilisés pour améliorer l'efficacité d'exécution. Le code macro lui-même n’est pas une fonction, mais il se comporte comme une fonction. Le préprocesseur remplace les appels de fonction en copiant les codes de macro, éliminant ainsi le besoin de pousser les paramètres sur la pile, de générer des appels CALL en langage assembleur, de renvoyer les paramètres et d'exécuter le retour, etc., améliorant ainsi la vitesse. Le plus gros inconvénient de l’utilisation du code macro est qu’il est sujet aux erreurs. Le préprocesseur produit souvent des effets secondaires inattendus lors de la copie du code macro.
Par exemple, l'instruction
#define MAX(a, b) (a) > (b) ? (a) : (b)
result = MAX(i, j) + 2 ;
sera interprétée par le préprocesseur comme
result = (i) > (j) ? (i) : (j) + 2 ;
Puisque l'opérateur ' ' a une priorité plus élevée que l'opérateur ' :', l'instruction ci-dessus n'est pas équivalente au
result = ( (i) > (j) ? (i) : (j) ) + 2 ;
attendu si le code de la macro est réécrit comme
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
Vous pouvez résoudre les erreurs causées par les priorités. Mais même utiliser le code macro modifié n'est pas infaillible, par exemple l'instruction
result = MAX(i++, j);
sera interprétée par le préprocesseur comme
result = (i++) > (j) ? (i++) : (j);
Pour C, utiliser également le code macro Un autre inconvénient : les données privées membres de la classe ne peuvent pas être exploitées, ce qui signifie que le code macro est essentiellement destiné aux opérations publiques ou globales.
Voyons comment fonctionne la « fonction inlining » de C. Pour toute fonction en ligne, le compilateur place la déclaration de la fonction (y compris le nom, les types de paramètres et le type de valeur de retour) dans la table des symboles. Si le compilateur ne trouve aucune erreur dans la fonction en ligne, le code de la fonction est également placé dans la table des symboles. Lors de l'appel d'une fonction en ligne, le compilateur vérifie d'abord si l'appel est correct (en effectuant un contrôle de sécurité de type ou en effectuant une conversion de type automatique, bien sûr la même chose pour toutes les fonctions). S'il est correct, le code de la fonction en ligne remplacera directement l'appel de fonction, éliminant ainsi la surcharge de l'appel de fonction. Ce processus est très différent du prétraitement, car le préprocesseur ne peut pas effectuer de contrôles de sécurité de type ni effectuer de conversions de type automatiques. Si la fonction en ligne est une fonction membre, l'adresse de l'objet (this) sera placée à l'endroit approprié, ce que le préprocesseur ne peut pas faire.
Le mécanisme d'intégration de fonctions du langage C a non seulement l'efficacité du code macro, mais augmente également la sécurité et peut exploiter librement les données membres de la classe. Par conséquent, dans les programmes C, tous les codes de macro doivent être remplacés par des fonctions en ligne « assert » est probablement la seule exception. assert est une macro qui ne fonctionne que dans la version Debug. Elle est utilisée pour vérifier les situations qui « ne devraient pas » se produire. Afin de ne pas provoquer de différences entre les versions Debug et Release du programme, assert ne devrait avoir aucun effet secondaire. Si assert est une fonction, puisque l'appel de fonction entraînera des modifications dans la mémoire et le code, il y aura une différence entre la version Debug et la version Release. Assert n’est donc pas une fonction, mais une macro.
2. Le style de programmation des fonctions en ligne
Le mot-clé inline doit être placé avec le corps de définition de la fonction. . Pour créer une fonction en ligne, le simple fait de mettre inline devant la déclaration de fonction n'a aucun effet. La fonction Foo dans le style suivant ne peut pas devenir une fonction en ligne :
inline void Foo(int x, int y); // inline 仅与函数声明放在一起,不起任何作用 void Foo(int x, int y) { … }
, tandis que la fonction Foo dans le style suivant devient une fonction en ligne :
void Foo(int x, int y); inline void Foo(int x, int y) // inline 与函数定义体放在一起 { … }
Par conséquent, inline est un "mot-clé pour l'implémentation" plutôt qu'un "mot-clé pour la déclaration". Généralement, les utilisateurs peuvent lire la déclaration d'une fonction, mais ne peuvent pas voir la définition de la fonction. Bien que le mot-clé inline soit ajouté avant le corps de déclaration et de définition des fonctions en ligne dans la plupart des manuels, je pense que inline ne devrait pas apparaître dans la déclaration d'une fonction. Bien que ce détail n'affecte pas la fonctionnalité de la fonction, il reflète un principe de base d'un style de programmation C/C de haute qualité : la déclaration et la définition ne peuvent pas être confondues, et les utilisateurs n'ont pas besoin et ne devraient pas savoir si une fonction a besoin. être en ligne.
Les fonctions membres définies dans la déclaration de classe deviendront automatiquement des fonctions en ligne, telles que
class A { public: void Foo(int x, int y) { … } // 自动地成为内联函数 }
Placer le Le corps de définition de la fonction membre dans la déclaration de classe peut apporter une commodité d'écriture, mais ce n'est pas un bon style de programmation. L'exemple ci-dessus doit être remplacé par :
// 头文件 class A { public: void Foo(int x, int y); } // 定义文件 inline void A::Foo(int x, int y) { … }
À utiliser avec prudence En ligne
Les constructeurs et destructeurs de classes sont facilement compris à tort comme étant plus efficaces à utiliser en ligne. Méfiez-vous des constructeurs et des destructeurs. Les fonctions peuvent cacher certains comportements, comme l'exécution "secrète" des constructeurs et des destructeurs de classes de base ou d'objets membres. Ne vous contentez donc pas de mettre les définitions des constructeurs et des destructeurs dans la déclaration de classe.
Ce qui précède est le contenu de la fonction C inlining. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !