Je suis toujours un débutant C ++. Je viens de lire que la fonction de membre statique d'une classe n'est pas spécifique à un objet - il existe une copie unique des fonctions de membre pour tous les objets. P>
Maintenant, deux questions se posent dans mon esprit: p>
Quelle est la différence entre une fonction ordinaire et une fonction statique "en termes d'allocation de mémoire uniquement"? p> li>
Et si la fonction de membre contient des variables locales? Dans ce cas, la fonction "devrait" avoir une copie séparée de cette variable spécifique à l'objet invoquant la fonction ... Comment ce problème est-il résolu en C ++? P> Li> ol>
Merci! P>
4 Réponses :
Si la fonction elle-même n'a que 1 copie, comment peut-elle avoir plusieurs copies de ses variables sur la pile?
Il y a un cadre de pile pour chaque invocation de la fonction.
Je trouverais peu peu probable qu'il y aurait une différence p> li>
semble être comme si vous souhaitez lire un peu la différence entre Heap Strong> et Pile Allocations forte>. Cela donne une bonne idée de la façon dont la mémoire fonctionne à un niveau bas, mais toujours élevé. Désolé, je ne peux pas être plus utile en ce moment. P> Li>
ol>
EDIT: Trop lente :) P>
Quelle est la différence entre un fonction ordinaire et une statique fonction "en termes de mémoire allocation seulement "? P>
rien. Une fonction statique est comme une fonction globale, à l'exception de la portée. P>
Même pour les fonctions des membres non statiques, il n'y a pas de mémoire supplémentaire requise. La fonction membre
INT C :: F (int Arg1, int Arg2) code> est juste du sucre syntaxique pour quelque chose comme
int C__f (c * this, int arg1, int arg2) code>. P>
Et si la fonction de membre contient certaines variables locales? Dans ce cas la fonction "devrait" avoir un séparé Copie de cette variable - spécifique à L'objet invoquant la fonction ... p> BlockQuote>
Il y a une copie des variables locales pour chaque invocation em> de la fonction (sauf si elles ne sont
statique code>). C'est pourquoi la récursion dans Possible en C ++. P>
Comment ce problème est-il résolu en C ++? P> blockQuote>
Les appels de fonction sont basés sur "Cadres de pile". Un cadre de pile consiste en: p>
- Les arguments de la fonction (y compris le
ce code> le cas échéant). LI>
- Tout autre autre code> statique code> variables locales dans la fonction. LI>
- L'adresse de retour ", qui indique au processeur où reprendre l'exécution une fois la fonction effectuée. LI> ul>
Chaque fois qu'une fonction est appelée, un cadre de pile est créé. Lorsque la fonction retourne, le cadre de pile est détruit. Si une fonction est appelée récursivement, chaque niveau de récursivité obtient son propre cadre de pile. Par exemple, si vous avez p>
xxx pré> alors lorsque vous appelez
factorial (3) code>, un cadre de pile est créé comme: p> < Pré> xxx pré>
Lorsque l'appel récursif est effectué sur
factorielle (2) code>, une image supplémentaire est ajoutée au sommet de la pile p>
xxx pré> Un autre appel récursif est effectué, à
factorial (1) code>. p>
xxx pré> C'est le cas de base pour la récursivité et le La valeur de retour de 1 est stockée dans un registre. L'appel de la fonction étant complet, le cadre de pile haut de pile est détruit et l'exécution continue à l'adresse de retour enregistrée. P>
xxx pré> maintenant, l'appel à
factorielle (2) Le code> peut calculer sa valeur de retour (2) et une autre image de pile peut être détruite: p>
xxx pré> Enfin, nous pouvons calculer le résultat de l'appel de la fonction d'origine (6), et détruire ce cadre de pile aussi. P> blockQuote>
Je voudrais corriger ma question: par "Fonction membre" dans ma 2e question, je veux dire "Fonction de membre statique"
Les cadres de pile fonctionnent de la même manière pour les fonctions de membre statique et non statique. La seule différence est de savoir si ceci code> est l'une des variables locales.
Il n'y a vraiment pas que beaucoup de différence. Les deux sont stockés en mémoire une seule fois, lorsqu'une méthode non statique est appelée, un pointeur sur l'objet actuel (le ce pointeur) est poussé sur la pile (ou stocké dans ECX en fonction de votre compilateur) en plus de toutes les fonctions paramètres. Une fonction statique n'a pas besoin d'une instance d'une classe, elle est donc simplement appelée comme une fonction C normale. P> li>
de même manière que dans C, avec la pile d'appels. p> li> ol>
Je voudrais corriger ma question: par "Fonction membre" dans ma 2e question, je veux dire "Fonction de membre statique"