IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Création de pile


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut Création de pile
    Bonsoir,

    Soit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int g(void)
    {
        int ret = 1;
        return ret;
    }
     
    void f(int n)
    {
        int m;
        int o = g(); /* (1) */
        int p;
    }
    Est-ce que la ligne commentée (1) a un impact sur la création de la pile de la fonction f lors d'un appel cette fonction f ?

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    La pile contient les variables locales déclarées dans ta fonction. Sur une architecture basique, comme x86, la fonction manipule, non pas une pile à part entière, mais un cadre de pile, qui symbolise une partie de la pile elle-même. En conséquence, l'appel de la fonction g va modifier la valeur contenue dans une adresse du cadre de pile. En pratique, cependant, les variables seront sûrement manipulées à partir des registres.
    Peut-être pourras-tu nous éclairer un peu à propos sur ta demande, afin que nous précisions un peu plus nos propos.

    Bonne soirée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    En fait je voulais en venir au fait que :

    1) est-ce que l'appel à g qui elle même doit avoir sa propre pile va impacter la taille de la pile de f (vu sa position dans le code) ?

    2) ou est-ce que la pile est d'abord dimensionnée (complètement) pour stocker les variables locales, paramètres, adresse de retour et valeur de retour de f (avec les variables locales non initialisées), puis une fois cette pile créée la variable o est initialisée par appel à la fonction g?

    3) est-ce que la norme ISO C précise comment doit être géré la déclaration d'une variable locale directement suivi d'une initialisation par appel de fonction ? ou est-ce implementation-dependent ?

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par backlash
    1) est-ce que l'appel à g qui elle même doit avoir sa propre pile va impacter la taille de la pile de f (vu sa position dans le code) ?
    Dans le cas général et théorique, non. Les deux fonctions ont leur cadre de pile propre, qui est initialisé en début de fonction, et, suivant la convention d'appel, détruit en fin de fonction. Maintenant, dans la pratique, le compilateur sera sûrement capable d'inliner la fonction g, et donc d'affecter directement 1 à o.

    Citation Envoyé par backlash
    2) ou est-ce que la pile est d'abord dimensionnée (complètement) pour stocker les variables locales, paramètres, adresse de retour et valeur de retour de f (avec les variables locales non initialisées), puis une fois cette pile créée la variable o est initialisée par appel à la fonction g?
    On va dire que c'est plutôt de cette manière. Ceci dit, il n'y a pas vraiment dimensionnement à proprement dit (la taille de la pile est fixe, à part quand on utilise quelques subterfuges), mais juste un ajustement du pointeur de pile. Tu peux le vérifier avec le code assembleur produit (syntaxe AT&T) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    g:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$16, %esp
    	movl	$1, -4(%ebp)
    	movl	-4(%ebp), %eax
    	leave
    	ret
    f:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$16, %esp
    	call	g
    	movl	%eax, -8(%ebp)  # 
    	leave
    	ret
    Citation Envoyé par backlash
    3) est-ce que la norme ISO C précise comment doit être géré la déclaration d'une variable locale directement suivi d'une initialisation par appel de fonction ? ou est-ce implementation-dependent ?
    Le C est avant tout quelque chose de portable ; il supporte donc des architectures exotiques, dont le modèle mémoire est différent de la pile, entre autres. Ce genre de détails est défini par l'ABI et par le compilateur ; c'est-à-dire, dans le formalisme normalien, par l'implémentation.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Merci Kirilenko

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Au passage, le standard C définit-il une taille minimale de pile?
    Pour l'instant, le plus proche que j'ai vu est "127 arguments in a function call"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Création d'une pile d'images
    Par ArnaudFu13 dans le forum Images
    Réponses: 3
    Dernier message: 17/10/2012, 11h01
  2. Création d'une pile sans pointeurs
    Par JonesKey dans le forum Débuter
    Réponses: 3
    Dernier message: 29/11/2009, 17h27
  3. [Linux] Création de la pile
    Par Prayeriz dans le forum Assembleur
    Réponses: 5
    Dernier message: 07/02/2008, 08h20
  4. création d'une jauge façon pile électrique
    Par Ekimasu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 16/05/2007, 12h21
  5. Création d'une pile d'images
    Par lia dans le forum OpenGL
    Réponses: 11
    Dernier message: 14/07/2006, 02h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo