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 :

Differences Stack et Heap [FAQ]


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Par défaut Differences Stack et Heap
    Je viens de relire une aide sur une API qui parle de Stack et de Heap ce qui doit correspondre au tas et a la pile si ma memoire est bonne ...

    Mais je sais absolument plus a quoi ca correspond et ou se cree nos variables et nos instances de classe dans Heap ou Stack ?


    Merci pour l'aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 19
    Par défaut
    Bonjour,

    Heap (le tas) : c'est là que l'on instancie tous les objets.
    Stack (pile) : on essaye de n'y placer que les types de base, ainsi que des pointeurs ... d'où l'utilisation de new

    B.

  3. #3
    Membre averti
    Inscrit en
    Mai 2003
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 28
    Par défaut
    donc quand je cree un objet a partir d'une classe je le cree dans le tas
    et quand je creer un int ou un char par exmple il se cree dans la stack ?

    jusque la ok

    Mais a quoi me sert le new alors ? et ou se cree les objets que je cree avec un new ? Faut il prendre des mesures precises avant d'ecrire dans la stack ou dans le heap ? Passque j'au trouve des API qui propose des fonctions pour etre sur qu'on deborde pas du tas ou de la pile ...

    Ouais je sais ca en fait des questions

  4. #4
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 380
    Billets dans le blog
    1
    Par défaut
    Non ce n'est pas ça.

    Toute variable globale (et variable locale déclarée "static") est stockée dans le segment de données.
    Toute variable locale à une fonction (non "static") est stockée dans la pile (stack).
    Toute zone mémoire allouée par new est stockée dans le tas (heap), zone située après le segment de données.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 19
    Par défaut
    Merci Anomaly pour tes précisions

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Merci effectivement, mais je souhaiterais avoir un peu plus de précisions, si possible...
    Quand on fait un malloc ou un new dans une DLL, on ne peut faire de free ou de delete à partir d'une autre DLL, même si elles sont chargées dans le même programme. En gros, quelle est la portée d'un heap ?
    De plus, (enfin on m'a toujours dit qu') il n'y a que 3 Segments dans un programme :
    • - un segment de données
      - un segment de pile
      - et un segment de code

    Si, comme tu le laisses entendre, le heap est situé après le segment de données, dans quoi est il stocké ?
    Merci d'éclairer ma petite lanterne (rouge)...

    @+
    Joe

    P.S.: je serai pas contre un petit rappel de l'ordre de ces segments

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Pour les spécificités des DLL, j'avoue ne plus savoir comment ça marche en détail. Il faudrait que je relise le bouquin de Jeffrey Richter. Cela a peu derapport avec le langage, c'est lié à l'OS.

    Par contre, en C++ c'est plus compliqué que tas vs pile. Car on a bien:
    - le tas (utilisé par malloc() et free())
    - et la pile (pour les variables automatiques),

    mais on a aussi :
    - le free-store (news et deletes ; son lien avec le tas n'est pas spécifié),
    - les données constantes (read-only, "chaines de caractères" et autres petits trucs connus à la compilation => pas d'objets ; implémentation propre à chaque compilateur et ses options de compilation),
    - et les variables globales et statiques (place prévue au lancement du programme, mais construction retardée jusqu'au moment où l'exécution passe par la définition de la donnée ; aucune certitude quant à l'ordre de construction de celles ci si elles sont au niveau global et réparties dans plusieurs unités de traduction diffférentes)

    cf Item 35 de Exceptional C++ d'Herb Sutter, publié chez Addisson Wesley. La version pré-publication de cet item doit être disponible sur GOTW (google!)

    Pour ce qui est des trois segments, c'est une version simplifiée de la réalité.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Bon, si les DLLs ont leur logique interne propre, que se passe-t-il au niveau des threads (en gros, qui partage quoi ?). Car s'il n'est pas possible d'allouer/désaollouer d'une DLL à l'autre, il y a bien une cause !...

    La suite n'est pas très claire (pour moi du moins) : le tas est utilisé par malloc et free ? et new et delete utilisent le free-store (kézako? où ca se situe ?) Il me semblait que new appelait malloc et delete, free.

    Tout ce que tu me dis est bel et bon, mais comment puis-je savoir où est ce satané "tas" et que représente-t-il (à part être l'espace où sont contenus les objets créés par malloc)

    Le free-store (et le heap) occasionnent-ils de nouveaux segments ? de nouveaux types de segment ?

    Si ma vision d'un programme (3 segments) est trop réductrice, quels sont les aspects que j'ai escamoté ?

    Au fait, ce site peut être intéressant mais je n'ai rien trouvé concernant ces points la, et puis je ne veux pas m'acheter ce livre juste pour mon stage...

    Merci de ton attention.
    @+
    Joel

    P.S.: oups j'ai un peu abusé au niveau des questions. Mais si je peux encore me permettre, quelle est le ratio de gain de performance entre une allocation dynamique et une allocation statique ?

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Pour les DLLs, ce n'est pas vraiment le bon endroit pour demander cela.

    Pour le free-store et compagnie : http://www.gotw.ca/gotw/009.htm. Soit, rien n'est assuré. Il peut y avoir un lien direct ou non entre le free-store et le tas. new n'appelle pas nécessairement malloc, on peut le modifier pour avoir notre propre gestionaire de mémoire qui lui appellera juste une fois ou 42 fois malloc() ou une fonction liée à l'OS.

    Tu n'as pas à savoir où est le tas. Il est. Et c'est tout ce dont tu as besoin de savoir pour 99% des applications que tu auras à programmer. Toutes les réponses à ces questions seront dans le bouquin de Richter. Si tu as vraiment besoin de savoir ça pour ton stage, alors fait le acheter par ta boite, car si ils te demandent ce genre de choses, ils auront besoin de savoir plus précisément comment ça marche.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut Merci !!!
    Ah cool magnifique !
    J'ai du me débrouillé comen une M****... Ton article est ce qu'il me fallait pour comprendre. En fait c'est pas mon maitre de stage qui me demand, c'est plutot moi qui voudrais savoir... Car je me suis déjà retrouvé avec une mauvaise gestion de pointeurs qui m'emmenait vers dbgheap.c et je voulais savoir plus en détail comment ca se passait par la suite...

    J'étais au courant pour new, mais je ne considérais que le comportement de base, sans surcharge de l'opérateur, ce qui est le cas dans 90% des programmes au moins (m'enfin je pense...)

    Merci encore pour ton efficacité, Luc. Tu mérites une médaille (en chocolat au moins !)

Discussions similaires

  1. heap et stack
    Par Shivan dans le forum Langage
    Réponses: 6
    Dernier message: 22/10/2009, 12h01
  2. Différence d'adresse mémoire stack et heap
    Par easyquizz dans le forum C++
    Réponses: 16
    Dernier message: 29/01/2009, 22h26
  3. mise au point sur la new, class, stack et heap
    Par cdm1024 dans le forum C++
    Réponses: 1
    Dernier message: 18/03/2008, 15h21
  4. Stack, Free store, Heap etc
    Par buzzkaido dans le forum C++
    Réponses: 4
    Dernier message: 29/09/2007, 18h04
  5. [general] differences entre les differentes heap
    Par deeal dans le forum C++/CLI
    Réponses: 6
    Dernier message: 04/08/2006, 17h28

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