135 votes

Quelle est la différence entre les fonctions "statique" et "statique en ligne"?

OMI à la fois rendre la fonction pour avoir une portée de l'unité de traduction uniquement,

quelle est la différence entre les fonctions "statique" et "statique en ligne"?

METTRE À JOUR

pourquoi inline devrait-il être placé dans un fichier d'en-tête, et non pas .c fichier?

115voto

Christoph Points 64389

Par défaut, une ligne de définition n'est valable que dans le courant de l'unité de traduction.

Si la classe de stockage est - extern, de l'identifiant liaison externe et la ligne de définition fournit également la définition externe.

Si la classe de stockage est - static, de l'identifiant interne de l'articulation et de la ligne de définition est invisible dans d'autres unités de traduction.

Si la classe de stockage n'est pas spécifié, la ligne de définition n'est visible que dans le courant de l'unité de traduction, mais l'identificateur a encore de la liaison externe et une définition externe doivent être fournis dans une autre unité de traduction. Le compilateur est libre d'utiliser la ligne ou la définition externe si la fonction est appelée dans le courant de l'unité de traduction.

Comme le compilateur est libre de inline (et non inline) toute fonction dont la définition est visible dans le courant de l'unité de traduction (et, grâce à un lien en temps optimisations, même dans les différentes unités de traduction, bien que le C standard n'a pas vraiment compte), à toutes fins pratiques, il n'y a pas de différence entre static et static inline des définitions de fonction.

L' inline spécificateur (comme l' register classe de stockage) n'est qu'un compilateur d'indice, et le compilateur est libre d'ignorer complètement. Conforme aux normes de la non-optimisation des compilateurs seulement à honorer leurs effets secondaires, et l'optimisation des compilateurs de ces optimisations, avec ou sans l'accord des conseils.

inline et register ne sont pas inutiles, bien, comme ils demander au compilateur de générer des erreurs lorsque le programmeur écrit le code qui ferait de la optimisations impossible: externe - inline définition ne peut pas référence à des identifiants avec une liaison interne (comme ces serait pas disponible dans une autre unité de traduction) ou de définir modifiables variables locales statiques durée de stockage (comme ceux-ci n'auraient pas partager l'état à travers les unités de traduction), et vous ne pouvez pas prendre les adresses de register-qualifiés variables.

Personnellement, j'utilise la convention de mark static des définitions de fonction dans les en-têtes aussi inline, comme la principale raison pour mettre des définitions de fonctions dans les fichiers d'en-tête est de les faire inlinable.

En général, je n'utilise static inline la fonction et de l' static const définitions d'objet en plus d' extern des déclarations dans les en-têtes.

Je n'ai jamais écrit un inline fonction avec une classe de stockage différent de static.

113voto

littleadv Points 15607

inline demande au compilateur de tenter d' intégrer la fonction contenu dans le code appelant au lieu de l'exécution d'un appel.

Pour les petites fonctions qui sont appelées fréquemment que peut faire une grande différence en termes de performances.

Cependant, ce n'est qu'un "conseil", et le compilateur peut l'ignorer, et la plupart des compilateurs va essayer de "inline", même si le mot clé n'est pas utilisée, dans le cadre de l'optimisation, où son possible.

par exemple:

static int Inc(int i) {return i+1};
.... // some code
int i;
.... // some more code
for (i=0; i<999999; i = Inc(i)) {/*do something here*/};

Cette boucle va effectuer un appel de fonction à chaque itération, et la fonction de contenu est en fait beaucoup moins que le code que le compilateur doit mettre pour effectuer l'appel. inline essentiellement en demander au compilateur de convertir le code ci-dessus dans un équivalent de:

 int i;
 ....
 for (i=0; i<999999; i = i+1) { /* do something here */};

Le saut de l'effectif de la fonction d'appel et de retour

Bien évidemment, ceci est un exemple pour montrer le point, pas un vrai morceau de code.

static se réfère à l'étendue. En C, cela signifie que la fonction/variable ne peut être utilisé à l'intérieur de la même unité de traduction.

8voto

shengy Points 2623

En C, statique signifie que la fonction ou la variable que vous définissez ne peut être utilisée que dans ce fichier (c'est-à-dire l'unité conforme).

so inline statique signifie la fonction inline qui ne peut être utilisée que dans ce fichier.

MODIFIER:

the compile unit devrait être The Translation Unit

5voto

R.. Points 93718

Une différence qui n'est pas au niveau de la langue , mais le niveau de mise en œuvre populaire: certaines versions de gcc enlèveront sans référence static inline fonctions de sortie par défaut, mais gardera plaine static fonctions même si déréférencées. Je ne suis pas sûr des versions concernées, mais d'un point de vue pratique, cela signifie que c'est toujours une bonne idée de toujours utiliser les fonctions inline pour static dans les en-têtes.

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