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 :

Stack, Free store, Heap etc


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Stack, Free store, Heap etc
    Quelques questions, pour ma culture générale....

    Suite à la lecture d'un post sur ce forum, et de cette doc :

    http://www.gotw.ca/gotw/009.htm

    J'aimerais comprendre comment ça se passe vis-a-vis du code que l'on tape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int uneFonction(int parametre)
    {
       int variable;
       // variable est allouée dans la "stack" ?
     
       variable = parametre * 2;
     
       return variable;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cClasse* uneFonction()
    {
       cClasse* pointeur;
     
       pointeur = new cClasse();
       // l'instance de cClasse est allouée dans le Free Store ou dans le Heap ?
     
       return pointeur;
    }
    Dans un fichier .h, si on définit une variable "globale" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int entierGlobal = 5;
    // l'int est alloué dans le Global/Static ?
    Dans un fichier .h, si on définit un pointeur "global" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cClasse* pClasse = new cClasse();
    // le pointeur pClasse est alloué dans le Global/Static
    // et l'instance de la classe est alloué dans le Free Store ou dans le Heap ?
    Enfin, est-ce le fait d'acceder successivement à des données allouées dans des segment différents à un rapport avec :
    - le nombre "d'erreur de cache" (quand le processeur doit recharger le cache parceque les données n'y sont pas déjà)
    - le nombre de "page fault" ("erreur" du meme genre, je crois) que l'on peut observer dans le gestionnaire des taches de windows

    Merci de m'éclairer !

  2. #2
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int uneFonction(int parametre)
    {
       int variable;
       // variable est allouée dans la "stack" ?
     
       variable = parametre * 2;
     
       return variable;
    }
    La variable locale 'variable' est créée par une allocation statique (ou automatique), elle est donc stockée dans la pile. Tu n'as pas a te soucier de la désallocation de lespace mémoire alloué, cela est fait automatiquement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cClasse uneFonction()
    {
       cClasse* pointeur;
     
       pointeur = new cClasse();
       // l'instance de cClasse est allouée dans le Free Store ou dans le Heap ?
     
       return pointeur;
    }
    Ici tu réserves un esace mémoire pour y stocker un objet cClasse. Tu utilises donc une allocation dynamique (dans le tas). Tu déclares un objet pointeur de cClasse, l'alloues avec l'opérateur new et le détruit avec un delete (à ne pas oublier sinon leaks).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int entierGlobal = 5;
    // l'int est alloué dans le Global/Static ?
    Oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cClasse* pClasse = new cClasse();
    // le pointeur pClasse est alloué dans le Global/Static
    // et l'instance de la classe est alloué dans le Free Store ou dans le Heap ?
    Ca c'est affreux.
    Sinon, en global tu definies ton pointeur : cClasse* pClasse; et dans le constructeur de ta classe, tu l'alloues avec l'opérateur new.
    Ainsi, ton pointeur est stocké das le global-static et l'instance est dans le tas.

    Citation Envoyé par buzzkaido Voir le message
    Enfin, est-ce le fait d'acceder successivement à des données allouées dans des segment différents à un rapport avec :
    - le nombre "d'erreur de cache" (quand le processeur doit recharger le cache parceque les données n'y sont pas déjà)
    - le nombre de "page fault" ("erreur" du meme genre, je crois) que l'on peut observer dans le gestionnaire des taches de windows

    Merci de m'éclairer !
    Je ne sais pas ou je ne comprend pas.

    Si j'ai dis une betise, n'hésitez pas à infirmer mes affirmations.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Merci pour la réponse !

    Ca c'est affreux.
    Sinon, en global tu definies ton pointeur : cClasse* pClasse; et dans le constructeur de ta classe, tu l'alloues avec l'opérateur new.
    Ainsi, ton pointeur est stocké das le global-static et l'instance est dans le tas.
    Là, j'ai pas tout compris ce que tu voulais dire...

    Quelqu'un d'autre pour confirmer/compléter ?

  4. #4
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Citation Envoyé par buzzkaido Voir le message
    Merci pour la réponse !
    Là, j'ai pas tout compris ce que tu voulais dire...

    Quelqu'un d'autre pour confirmer/compléter ?
    Avec plaisir.

    il faut comprendre que déclarer une variable globale n'est pas forcément propre et déclarer un pointeur l'est encore moins!
    Sinon en global tu met "cClasse *pointeur;" et dans le constructeur tu alloues l'espace mémoire nécessaire avec l'opérateur new/malloc.
    Et dans le destructeur un petit delete/free.

    Citation Envoyé par buzzkaido Voir le message
    Ce que je veux dire par là, c'est :

    La mémoire utilisée par un programme étant composée de différents "segments" (segment de code, tas, global et pile ?) est-ce que utiliser au sein d'une même fonction des données stockées dans différents segments a un impact sur l'accès à ces données par le processeur ?
    L'accès (lecture/écriture) à une donnée de la pile devrait être plus rapide qu'un accès dans le tas. Je n'en dirai pas plus dans le doute de t'induire en erreur..

    Citation Envoyé par buzzkaido Voir le message
    Est-ce que charger des données de différents segments implique de recharger le cache ? ou de changer de "page" ?

    Au fait, si quelqu'un peut preciser la définition d'un segment et d'une page, ce serait sympa, ch'suis pas sûr...

    Dans le gestionnaire des tâces de windows, dans le menu "affichage", on peut selectionner différents colonnes, notamment :
    - Ecart d'utilisation de la mémoire
    - Erreurs de page
    - Ecart d'erreurs de pagination
    - Reserve paginée
    - Reserve non paginée

    A quoi corrrespondent ces colonnes ?
    PS : Si je suis pas dans le bon forum, dites-le moi !
    Je ne sais pas si tu ne confonds pas un peu.
    L'accès au différents segments est automatique.
    Attends confirmation d'un autre membre qui affirmerait sans avoir de doute.
    Pour ce qui est de savoir ce que signifie les colonnes... Google

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Citation Envoyé par buzzkaido Voir le message
    Enfin, est-ce le fait d'acceder successivement à des données allouées dans des segment différents à un rapport avec :
    - le nombre "d'erreur de cache" (quand le processeur doit recharger le cache parceque les données n'y sont pas déjà)
    - le nombre de "page fault" ("erreur" du meme genre, je crois) que l'on peut observer dans le gestionnaire des taches de windows

    Merci de m'éclairer !
    Ce que je veux dire par là, c'est :

    La mémoire utilisée par un programme étant composée de différents "segments" (segment de code, tas, global et pile ?) est-ce que utiliser au sein d'une même fonction des données stockées dans différents segments a un impact sur l'accès à ces données par le processeur ?

    Est-ce que charger des données de différents segments implique de recharger le cache ? ou de changer de "page" ?

    Au fait, si quelqu'un peut preciser la définition d'un segment et d'une page, ce serait sympa, ch'suis pas sûr...

    Dans le gestionnaire des tâces de windows, dans le menu "affichage", on peut selectionner différents colonnes, notamment :
    - Ecart d'utilisation de la mémoire
    - Erreurs de page
    - Ecart d'erreurs de pagination
    - Reserve paginée
    - Reserve non paginée

    A quoi corrrespondent ces colonnes ?


    PS : Si je suis pas dans le bon forum, dites-le moi !

Discussions similaires

  1. 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
  2. "Free Heap block" en mode debug?
    Par kacedda dans le forum Visual C++
    Réponses: 2
    Dernier message: 22/04/2007, 12h13
  3. probleme free heap block lors d'un malloc
    Par gronaze dans le forum C
    Réponses: 2
    Dernier message: 24/03/2006, 15h01
  4. Erreur --> HEAP: Free Heap block à la fermeture
    Par Marthym dans le forum MFC
    Réponses: 1
    Dernier message: 23/01/2006, 11h41
  5. Differences Stack et Heap
    Par elsargento dans le forum C++
    Réponses: 9
    Dernier message: 26/05/2004, 16h10

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