7
votes

Allocation de mémoire aux fonctions en C ++

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.

Maintenant, deux questions se posent dans mon esprit:

  1. Quelle est la différence entre une fonction ordinaire et une fonction statique "en termes d'allocation de mémoire uniquement"?

  2. 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 ++?

    Merci!


1 commentaires

Je voudrais corriger ma question: par "Fonction membre" dans ma 2e question, je veux dire "Fonction de membre statique"


4 Réponses :


4
votes
  1. Aucune différence
  2. Les variables locales sont créées et détruites sur la pile par appel de la fonction

2 commentaires

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.



2
votes
  1. Je trouverais peu peu probable qu'il y aurait une différence

  2. semble être comme si vous souhaitez lire un peu la différence entre Heap et Pile Allocations . 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.

    EDIT: Trop lente :)


0 commentaires

9
votes

Quelle est la différence entre un fonction ordinaire et une statique fonction "en termes de mémoire allocation seulement "?

rien. Une fonction statique est comme une fonction globale, à l'exception de la portée.

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) est juste du sucre syntaxique pour quelque chose comme int C__f (c * this, int arg1, int arg2) .

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 ...

Il y a une copie des variables locales pour chaque invocation de la fonction (sauf si elles ne sont statique ). C'est pourquoi la récursion dans Possible en C ++.

Comment ce problème est-il résolu en C ++?

Les appels de fonction sont basés sur "Cadres de pile". Un cadre de pile consiste en:

  • Les arguments de la fonction (y compris le ce le cas échéant).
  • Tout autre autre statique variables locales dans la fonction.
  • L'adresse de retour ", qui indique au processeur où reprendre l'exécution une fois la fonction effectuée.

    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 xxx

    alors lorsque vous appelez factorial (3) , un cadre de pile est créé comme: < Pré> xxx

    Lorsque l'appel récursif est effectué sur factorielle (2) , une image supplémentaire est ajoutée au sommet de la pile xxx

    Un autre appel récursif est effectué, à factorial (1) . xxx

    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. xxx

    maintenant, l'appel à factorielle (2) peut calculer sa valeur de retour (2) et une autre image de pile peut être détruite: xxx

    Enfin, nous pouvons calculer le résultat de l'appel de la fonction d'origine (6), et détruire ce cadre de pile aussi.


2 commentaires

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 est l'une des variables locales.



0
votes
  1. 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.

  2. de même manière que dans C, avec la pile d'appels.


0 commentaires