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 :

Espace disponible sur la pile


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Espace disponible sur la pile
    Bonjour,

    Je voulais savoir s'il existait une fonction en langage C renvoyant l'espace libre disponible sur la pile (d'ailleurs à combien est limité théoriquement cet espace ? à celui de la mémoire RAM ?). Voici le contexte: j'alloue dynamiquement de nombreux tableaux dont la taille est d'abord calculée et j'aimerais m'économiser plusieurs tests de pointeurs null en testant si l'espace total de mes tableaux est disponible dans la pile. Si ce n'est pas le cas, je n'alloue rien, le programme se termine.

    Merci pour vos réponses.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut,

    De toute façon, si tu alloues dynamiquement de la mémoire, cela ne se fera pas sur la pile mais sur le tas. La pile va stocker les objets locaux à une fonction par exemple. Le principe d'une pile, c'est d'empiler pour dépiler ensuite : cela veut dire que les données qui sont dessus n'ont pas pour vocation à rester indéfiniment. C'est pourquoi lorsqu'on quitte une fonction, les données qui avaient été empilés par l'appel de la fonction et de la déclaration des variables locales sont "effacées".

    Lorsqu'on fait de l'allocation dynamique, il faut de toute façon toujours tester si cela s'est bien déroulé même si on suppose qu'il y a suffisamment de mémoire. Un problème peut toujours se produire de manière inattendue.

    Rien n'interdit d'allouer plus de mémoire que ce dont on a besoin, et d'agrandir, lorsque cela devient nécessaire, à coup de realloc (ce qui évite justement de faire trop appel à cette fonction, qui consomme inutilement des ressources lorsqu'on l'appelle trop souvent).
    Par exemple, si tu es amené à agrandir en permanence l'espace alloué, tu peux réserver 5 ou 10 fois plus d'espace mémoire que ce que tu as besoin à l'instant T... puis une fois que tu as rempli la totalité, tu recommences (en utilisant realloc). Ceci évite d'appeler realloc à chaque fois et trop souvent, cela consomme des ressources.
    Après, tout dépend ce que tu veux faire, il n'y a que toi qui connait ton programme. Il y a plusieurs manière de faire, en fonction de.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse.

    Oui, pardon, je voulais bien parler du tas.

    OK pour les tests individuels des pointeurs.

    En fait j'évoquais cette fonction car sur une plateforme particulière (Texas Instruments), il existe la fonction HeapAvail qui renvoie le nombre de bytes disponibles.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    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 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Même sur TI, tu risques d'avoir une mauvaise surprise avec HeapAvail(). C'est HeapMax() qu'il faut utiliser pour ça.

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    OK, donc ce type de fonction n'existe pas ailleurs ?
    Sinon personne ne sait la limite de l'espace alloué au tas (et le type de mémoire utilisé - RAM ou virtuelle) ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    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 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Comme dit Raymond Chen, si tu as besoin de connaître la limite, c'est que tu demandes trop.

    Au pire si tu veux éviter certains tests de pointeurs nuls, alloue tout en une fois, comme ça tu ne feras qu'un seul test (puisqu'apparemment, tu calcules la taille à l'avance de toute façon).

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne comprends pas pourquoi tu t'embêtes avec tout ça. Dans tous les cas, tu seras obligé de faire un test. Car si tu veux connaître la quantité maximale de mémoire disponible, cela veut dire que tu seras obligé, lors de chaque allocation, de vérifier que la taille totale de tes tableaux ne dépasse justement pas cette valeur.
    Finalement, dans les deux cas, cela revient au même, il y aura un test à effectuer : ou bien vérifier le retour de malloc ou bien vérifier que la taille totale de tes tableaux ne dépasse pas la valeur maximale disponible.

    Bon, après, si c'est pour de l'embarqué (lorsque tu parles de TI, je n'ai pas compris s'il s'agit juste d'un exemple ou si ton programme doit tourner dessus), c'est certainement différent (optimisation, etc). Dans ce cas, je ne pourrai pas te conseiller quelle est la meilleure méthode. ^^

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Disons que ça me permettrait de gagner un peu de temps: si je passe par des tests de pointeurs, il se peut que seul le dernier pointeur me renvoie NULL, et dans ce cas, je ne pourrai de toute façon pas commencer mon programme. Si je connaissais la valeur max du tas, je pourrais d'entrée de jeu, avant même d'entamer les tests des pointeurs, vérifier si l'espace du tas est suffisant.

    Je ne programme pas (plus) sur TI: le programme est sous Windows. C'était juste un souvenir.

  9. #9
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Normalement tu peux accéder à ce genre d'informations avec les fonctions getrlimit, sysconf ou sysctl et moyennant quelques calculs.

    Ceci dit, je rejoins l'avis global, qui est de ne pas s'embêter avec ce genre de chose mais plutôt de contrôler que les allocations se passent bien, en vérifiant les valeurs de retour de malloc/calloc/....

    Autrement tu peux aussi poser une limite dans la configuration de ton application, ce qui sera plus simple que d'aller lire les paramètres systèmes.

  10. #10
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    OK. Je ne connaissais pas ces fonctions.

    Merci à tous pour vos réponses !

    Bonne soirée.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2010, 15h15
  2. Tester l'espace disponible sur un lecteur reseau
    Par Celestis dans le forum Access
    Réponses: 20
    Dernier message: 03/05/2010, 11h51
  3. Réponses: 2
    Dernier message: 16/12/2007, 20h55
  4. Réponses: 2
    Dernier message: 15/06/2005, 18h01
  5. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47

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