statique des variables dans une fonction inline
J'ai une fonction qui est déclarée et définie dans un fichier d'en-tête. C'est un problème par lui-même. Lorsque cette fonction n'est pas incorporé, chaque unité de traduction qui utilise cet en-tête obtient une copie de la fonction, et quand ils sont liés ensemble, nous sont dupliqués. Je "fixe" qu'en faisant de la fonction inline, mais je crains que ce est un fragile de solution parce qu'autant que je sache, le compilateur ne garantit pas l'in-lining, même lorsque vous spécifiez le mot clé "inline". Si ce n'est pas vrai, merci de me corriger.
De toute façon, la vraie question est de savoir ce qui se passe pour les variables statiques à l'intérieur de cette fonction? Le nombre de copies à faire, je me retrouve avec?
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous avez raté quelque chose, ici.
fonction statique?
La déclaration d'une fonction statique de se faire "caché" dans son unité de compilation.
Si vous déclarez cette fonction statique dans un en-tête, alors toutes les unités de compilation, y compris cet en-tête ont leur propre copie de la fonction.
La chose est, si il y a des variables statiques à l'intérieur de cette fonction, chaque unité de compilation, y compris cet en-tête auront aussi leur propre, version personnelle.
fonction inline?
Déclarant inline en fait un candidat pour inline (il ne signifie pas grand-chose de nos jours en C++, le compilateur en ligne ou pas, parfois, en ignorant le fait que le mot-clé inline est présent ou absent):
Dans un en-tête, elle a un effet secondaire: La fonction inline peut être défini plusieurs fois dans le même module, et l'éditeur de liens il vous suffit de rejoindre le "eux" en un seul (si elles n'ont pas été intégrées pour le compilateur de la raison).
Statique des variables déclarées à l'intérieur, la norme spécifiquement dit qu'il y a un, et un seul d'entre eux:
(fonctions sont par défaut externe, donc, sauf si vous la marque de votre fonction statique, cela s'applique à cette fonction)
Cela a l'avantage de "statique" (c'est à dire qu'il peut être défini dans un en-tête) sans ses défauts (il existe au plus une fois, si il n'est pas incorporé)
variable locale statique?
Variables locales statiques ont pas de lien (on ne peut pas être désigné par le nom en dehors de leur champ d'application), mais a statique de la durée de stockage (c'est à dire qu'il est mondial, mais sa construction et de la destruction obéir à des règles spécifiques).
statique + inline?
De mixage en ligne et statique aura alors les conséquences que vous avez décrit (même si la fonction est insérée, la variable statique à l'intérieur ne sera pas, et vous vous retrouverez avec autant de variables statiques comme vous l'avez unités de compilation, y compris la définition de vos fonctions statiques).
Réponse de l'auteur, la question de savoir
Donc je suppose que vous avez quelque chose comme ça:
Vous devez réaliser que la variable statique à l'intérieur de la fonction, il suffit de mettre, une variable globale caché de tous, mais la fonction de la portée, ce qui signifie que seule la fonction à laquelle elle est déclarée à l'intérieur peut atteindre.
Inlining la fonction ne change rien:
Il n'y aura qu'une variable globale masquée. Le fait que le compilateur va essayer d'insérer le code ne change pas le fait il n'existe qu'une seule variable cachée.
Maintenant, si votre fonction est déclarée statique:
Ensuite, il est "privé" pour chaque unité de compilation, ce qui signifie que chaque fichier CPP, y compris l'en-tête où la fonction statique est déclaré aura sa propre copie privée de la fonction, y compris sa propre copie privée de global variable cachée, donc autant de variables qu'il y a des unités de compilation, y compris l'en-tête.
L'ajout de "en ligne" à "statique" de la fonction avec un "statique" de la variable à l'intérieur:
a le même résultat que de ne pas l'ajout de cette mot clé "inline", autant que la variable statique à l'intérieur est concerné.
Donc, le comportement de VC++ est correcte, et que vous êtes se méprendre sur le sens réel de "inline" et "statique".
inline void doSomething() { static int value ; }
, la fonction a une liaison externe ; c'est une ODR violation si elle apparaît dans un en-tête est inclus à partir de deux unités différentesinline
, il ne peut pas violer l'ODR.Je crois que le compilateur crée de nombreuses copies de la variable, mais l'éditeur de liens en choisit un et rend tous les autres, référence. J'ai eu des résultats similaires quand j'ai tenté l'expérience de créer différentes versions d'une fonction inline; si la fonction n'était pas réellement inline (mode debug), tous les appels sont allés à la même fonction, quel que soit le fichier source, ils ont été appelés à partir.
Penser comme un compilateur pour un instant - comment pourrait-il en être autrement? Chaque unité de compilation (fichier source) est indépendant des autres, et peuvent être compilés séparément; chacun doit donc créer une copie de la variable, en pensant qu'il est le seul. L'éditeur de liens a la capacité d'atteindre à travers ces frontières et ajuster les références pour les deux variables et de fonctions.
J'ai trouvé la Marque Rançon de la réponse et des conseils pour que le compilateur crée de nombreuses copies de la variable statique, mais l'éditeur de liens choisit et applique à travers toutes les unités de traduction.
Ailleurs j'ai trouvé ceci:
Voir [dcl.fct.spec]/4
Je n'ai pas de copie de la norme pour vérifier, mais il correspond à mon expérience de l'examen de l'assemblée dans VS 2008 Express
C'est censé être de cette façon.
"statique" indique au compilateur que vous voulez de la fonction est locale à l'unité de compilation, donc vous voulez une copie par unité de compilation et d'une copie des variables statiques par exemple de la fonction.
"associé" est utilisé pour indiquer au compilateur que la fonction est insérée; de nos jours, il suffit juste d'elle que "c'est ok si il y a plusieurs copies du code, assurez-vous juste que c'est la même fonction". Si tout le monde partage les variables statiques.
Note: cette réponse a été écrite en réponse à la réponse de l'affiche originale posté à lui-même.
inline
causes de la fonction inline ou c'est ok d'avoir plusieurs copies?inline
n' cause inline, c'est juste le suggère, et il permet de plus d'une définition (mais pas dans la même unité de compilation).Depuis que j'ai écrit la question que je l'ai essayé avec Visual Studio 2008. J'ai essayé d'activer toutes les options qui font de VS agir en conformité avec les normes, mais il est possible que j'ai raté quelques. Ce sont les résultats:
Lorsque la fonction est simplement "inline", il n'y a qu'une seule copie de la variable statique.
Lorsque la fonction est "static inline", il y a autant d'exemplaires qu'il y a des unités de traduction.
La vraie question est maintenant de savoir si les choses sont censé être de cette façon, ou si c'est un ideosyncracy de le compilateur C++ de Microsoft.
Inline signifie que le code exécutable (instructions) est incorporé dans la fonction d'appel du code. Le compilateur peut choisir de le faire, indépendamment de savoir si vous avez fait la demande. Qui n'a pas d'effet sur les variables (données) déclarée dans la fonction.
En plus de tous les problèmes de conception tout cela peut impliquer, puisque vous êtes déjà coincé avec elle, vous devez utiliser l'électricité statique dans ce cas, pas en ligne. De cette façon, tout le monde partage les mêmes variables. (Fonction statique)
Je crois que vous allez vous retrouver avec un par unité de traduction. Vous avez effectivement eu de nombreuses versions de cette fonction (et ses déclarée statique de la variable), un pour chaque unité de traduction qui comprend l'en-tête.
Statique signifie un exemplaire est distribué dans tout le programme , mais en ligne signifie qu'il exige le même code plusieurs fois dans le même programme , de sorte qu'il n'est pas possible de faire une variable statique à l'intérieur de la fonction inline.