statique et en ligne

Je programme en C. Je veux une description des fonctions statiques et en ligne. Je sais que si nous rendons une fonction statique, cela indique au compilateur qu’elle est sous liaison interne pour une seule unité de traduction. J’ai des doutes concernant statique et en ligne:

  1. Si nous faisons une fonction statique, pouvons-nous l’utiliser dans d’autres unités de traduction … c’est-à-dire dans d’autres fichiers .c? Si oui, comment?
  2. Si nous faisons la fonction en ligne statique, quelle est la différence alors? Comment cela sera-t-il traité par le compilateur?
  3. Créer une fonction en statique donne-t-il le même effet qu’une macro?
  4. Traiter une fonction pour qu’elle soit en ligne dépend du compilateur en fonction de sa taille. Alors, y a-t-il un moyen de le forcer à être traité comme si c’était en ligne?
  5. Comment pouvons-nous utiliser des fonctions en ligne et statiques pour l’optimisation?

S’il vous plaît jeter un peu de lumière sur les choses ci-dessus en ligne. La plate-forme est Linux, compilateur gcc, langage C.

  1. Une fonction static ne peut pas être utilisée dans d’autres unités de traduction. C’est leur raison d’être.

  2. inline indique au compilateur que la fonction doit être en ligne au lieu d’être appelée.

  3. Rendre une fonction statique est différent de l’utilisation d’une macro. Une macro remplace essentiellement le compilateur. Qu’il soit judicieux de s’inscrire ou non, une macro sera intégrée; les macros sont des substitutions textuelles. Vous pouvez également transmettre une fonction static à quelque chose nécessitant un pointeur de fonction. Je ne peux pas faire ça avec une macro.

  4. Les macros seront forcément en ligne n’importe quoi. Même en spécifiant inline peut être annulé.

  5. Créez des fonctions que vous ne souhaitez pas exporter en static . Si une fonction est vraiment petite et que vous pensez vraiment qu’elle devrait être en ligne, vous pouvez le dire au compilateur avec inline . Les macros sont vraiment uniquement pour la métaprogrammation. Le compilateur sait mieux que vous.

static et inline deux objectives très différents.

Comme vous le dites correctement, static signifie que le symbole de la fonction n’est pas exporté de l’unité de compilation où il est défini. Par conséquent, différentes unités de compilation peuvent avoir de tels symboles avec le même nom sans conflit. Que cela corresponde ou non à la même déclaration de fonction et à la même définition, c’est à vous de décider. Mais des fonctions telles que tous les objects alloués de manière statique peuvent bien être utilisées dans une unité de compilation différente en exportant de manière statique ou dynamic un pointeur sur celle-ci.

inline est différent. Son objective est de permettre au compilateur d’aligner votre fonction, d’où son nom, mais son principal effet direct est que le symbole de la fonction n’est généralement pas émis. Ceci est conçu pour que vous puissiez placer la définition de la fonction dans un fichier d’en-tête et l’inclure dans plusieurs unités de compilation sans créer plusieurs symboles dans chacune d’elles. Pour la fonction définie, cela a également pour effet que vous n’êtes pas autorisé à déclarer static variables static à l’intérieur d’une fonction en inline , car il ne serait pas clair du tout dans quelle unité de compilation cet object devrait être réalisé.

Donc, pour résumer, static génère beaucoup de copies de votre fonction, inline n’en génère aucun; static est principalement utilisé dans les fichiers ".c" et inline dans ".h"

Le premier a pour effet que, à certains endroits, vous ne pouvez pas détecter que deux pointeurs de fonction pointent vers la “même” fonction, le second peut avoir pour effet que si vous avez besoin d’un pointeur de fonction sur la fonction, il n’y a pas d’object de fonction auquel il serait destiné. référer. Une telle fonction peut être forcée pour être émise (dans une seule unité de compilation!) En plaçant une sorte “d’instanciation” dans le fichier .c:

 // .h definition inline void toto(void) { } // .c instantiation void toto(void); 

Les compilateurs de ces jours détermineront si une fonction en ligne sera réellement en ligne ou non, car toutes les fonctions ne sont pas de bons candidats. Si tel est le cas, le corps de la fonction est simplement injecté / en ligne et la fonction correspondante est référencée.

Ces fonctions doivent être réservées aux appels de fonctions fréquents pour lesquels le corps de la fonction est généralement assez court, bien que je suppose que cela ne doit pas nécessairement être le cas.