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 :

mémoire du tas


Sujet :

C++

  1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut mémoire du tas
    Bonjour tous ,
    je désire savoir combien d'octets restent libres dans le tas pendant l'execution
    d'un programme . Voici le code :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
    int Tas_restant(void);
     
    int main()
    {
        long int *i1;
     
        cout << Tas_restant() << "  octets" << endl;
        while(1)
        {
            i1 = new (nothrow) long int[1234];
            if(!i1) break;
        }
        cout << Tas_restant() << "  octets" << endl;
     
        return 0;
    }
    int Tas_restant(void)
    {
        double  puissance = 32.0;
        unsigned int heap_allocation_size = pow(2.0,puissance)-1;// 2 puissance 32
        unsigned long    heap_maxi = 0;
        char    *pChar;
     
        while(puissance>=0)
        {
            pChar = new (nothrow) char[heap_allocation_size];
            if(pChar)
            {
                heap_maxi += heap_allocation_size;
            }
            else
            {
                heap_allocation_size = pow(2.0,--puissance)-1;
            }
        }
        return heap_maxi;
    }
    Le premier appel à "Tas_restant()" semble cohérent ; par contre ,le second
    renvoit invariablement 0 alors qu'il semble évident qu'il doit bien rester quelques petits octets de libre , non !

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Meh ?

    Si tu es sous Windows, tu peux obtenir cette information plus simplement, en utilisant la fonction GlobalMemoryStatusEx(). Ceci dit, les informations en retour sont de peu d'intérêt : la taille de la zone mémoire accessible avec un process est fixée par le working set de ce process (cf. Process Working Set sur le MSDN) ; elle ne peut excéder 2 Go sur les Windows 32 bits (3 Go sir WIndows est démaré avec un switch spécial). La mémoire étant virtualisée, tu auras toujours une taille de zone mémoire dispo égale à min(mémoire physique + taille cache, 2 Go) (pour simplifier). Cf Memory Management sur le MSDN.

    Sous linux (ou sur un OS posix), getrlimit est plus précis, puisque tu peux récupérer la taille du heap du process courant. Cependant, cette taille peut être modifiée via un appel à brk() ou sbrk() (fonctions utilisées en interne par malloc ou new pour allouer du heap supplémentaire pour le process ; non POSIX, mais je ne connais pas un *nix qui ne l'implémente pas).

    Du coup, point n'est besoin de faire le calcul toi même
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/04/2012, 11h27
  2. Compilation, la séparation du tas dans la mémoire
    Par Djobird dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 17/10/2007, 15h06
  3. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 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