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 maximale d'un programme c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité1
    Invité(e)
    Par défaut mémoire maximale d'un programme c
    J'ai une petite question ce matin (ici, c'est le matin). . .

    Je me demandais, quelle est la mémoire maximale qu'un programme que je code en c peut utiliser?

    Merci
    Alex

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Si tu parles du code lui-même, il n'y a pas vraiment de limite si ce n'est celle imposée par le système d'exploitation lui-même, qui dépendra surtout de la RAM dont tu disposes, et avec le mapping, ce n'est même plus tout-à-fait vrai.

    Si tu veux connaître la quantité de mémoire que tu peux allouer à l'exécution de ton programme, là encore, ça dépendra de l'implémentation. Un malloc() sans fin utilisera d'abord toute la RAM (moins une certaine marge de fonctionnement) disponible puis le swap entier ... jusqu'à ce que ton système plante, à moins que des quotas explicites n'aient été posés à l'exécution de ton programme.

    Un seul détail à retenir : faire attention à la taille du segment de pile. L'allocation de mémoire est implicite dans ce cas mais pourtant, le compilateur ne peut pas toujours calculer à l'avance la taille exacte maximum nécessaire, en particulier dans le cas de fonctions récursives.

    Sauf erreur, il me semble bien qu'il n'existe pas, en C, de fonction universelle et portable pour connaître la taille de l'espace mémoire disponible restant.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Alexandreg12 Voir le message
    Je me demandais, quelle est la mémoire maximale qu'un programme que je code en c peut utiliser?
    Ca dépend de l'implémentation. Le C donne des minimas garantis pour un objet statique ou alloué :
    • C90 : 32767 bytes
    • C99 : 65535 bytes

    Pour une implémentation donnée, il faut lire la doc. Elle ne peut dépasser
    • C90 : ((size_t) (-1))
    • C99 : SIZE_MAX (défini dans <limits.h>)

    La limite réelle est déterminée par la quantité de mémoire disponible sur le système à un moment donné (ça peut changer dans le temps).

    Pourquoi cette question ?

  4. #4
    Invité1
    Invité(e)
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message

    Pourquoi cette question ?
    Je suis curieux et j'avais pensé à ça hier!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ca dépend de l'implémentation. Le C donne des minimas garantis pour un objet statique ou alloué :
    • C90 : 32767 bytes
    • C99 : 65535 bytes
    C'est pas clair. Ca veut dire qu'on ne peut pas allouer plus de 65KB ? :S. Fishy...

    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pour une implémentation donnée, il faut lire la doc. Elle ne peut dépasser
    • C90 : ((size_t) (-1))
    • C99 : SIZE_MAX (défini dans <limits.h>)
    Comprends pas.

    Merci

  6. #6
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Sauf erreur, il me semble bien qu'il n'existe pas, en C, de fonction universelle et portable pour connaître la taille de l'espace mémoire disponible restant.
    Il y a getrlimit() sur certains unixoïdes.

    Citation Envoyé par bulki Voir le message
    C'est pas clair. Ca veut dire qu'on ne peut pas allouer plus de 65KB ? :S. Fishy...



    Comprends pas.

    Merci
    C'est des minimums et des maximums, la vraie limite de ton sytème se situe quelque part entre les deux. (size_t)-1 est le plus grand entier non signé qui tient dans un size_t (le type qui sert à compter les bytes), SIZE_MAX est une constante définie dans limits.h.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par dapounet Voir le message
    Il y a getrlimit() sur certains unixoïdes
    Effectivement ! Le pire, c'est que je connaissais en écriture (jamais eu besoin de fixer ces valeurs, cependant) et que je n'avais pas du tout pensé à ça sur le coup.

    Merci pour cette précision.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bulki Voir le message
    C'est pas clair. Ca veut dire qu'on ne peut pas allouer plus de 65KB ?
    Sur certaines implémentation, non. Par exemple sur une machine x86 en mode réel (16-bit) avec modèle de mémoire small, le segment de données fait 64 ko.
    Comprends pas.
    Qu'est-ce que tu ne comprends pas ? Je veux bien répondre à une question, mais encore faut-il qu'il y ait une question ...

    P.S. J'ai ajouté une petite précision.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Sur certaines implémentation, non. Par exemple sur une machine x86 en mode réel (16-bit) avec modèle de mémoire small, le segment de données fait 64 ko.

    Qu'est-ce que tu ne comprends pas ? Je veux bien répondre à une question, mais encore faut-il qu'il y ait une question ...

    P.S. J'ai ajouté une petite précision.
    Je crois qu'on est en train de se mélanger les pinceaux , entre taille d'un size_t et mémoire adressable par un processus.

    Concernant le realmode, on peut avoir accès jusqu'à 64Ko, cad 2^16, car on a que 16 bits. Cependant, on arrive tout de même à adresser 1Mo avec la mémoire étendue.

    On est bien d'accord que sur un ia32, l'espace virtuel adressable est de 4GB pour un processus donné (moins l'espace kernel, etc), non (et de 2^48b pour un x86_64)?

  10. #10
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par bulki Voir le message
    Concernant le realmode, on peut avoir accès jusqu'à 64Ko, cad 2^16, car on a que 16 bits. Cependant, on arrive tout de même à adresser 1Mo avec la mémoire étendue.
    20 bits d'adressage de base donc 1 Mio, et avec la mémoire étendue on arrive maximum à 0x10FFEF (0xFFFF0 + 0xFFFF) soit 1 114 096 octets donc à peu près 1 Mio et 64 Kio si je sais encore compter.

    Citation Envoyé par bulki Voir le message
    On est bien d'accord que sur un ia32, l'espace virtuel adressable est de 4GB pour un processus donné (moins l'espace kernel, etc), non (et de 2^48b pour un x86_64)?
    Ça n'a pas grand-chose à voir avec ce que le programme pourra utiliser à l'exécution, par exemple pour la taille de la pile sous Windows : http://msdn.microsoft.com/en-us/library/8cxs58a6.aspx
    For x86 and x64 machines, the default stack size is 1 MB.

Discussions similaires

  1. mémoire maximale utilisée par un programme
    Par xavierdestev dans le forum Débuter
    Réponses: 4
    Dernier message: 26/12/2013, 22h53
  2. Allocation mémoire et interruption de programme
    Par vinzzzz dans le forum Réseau
    Réponses: 19
    Dernier message: 12/11/2007, 17h49
  3. Comme lire la mémoire d'un autre programme ?
    Par cmarcx dans le forum Langage
    Réponses: 1
    Dernier message: 29/10/2007, 13h51
  4. Utilisation de la mémoire vive par un programme
    Par Pixcoder dans le forum C++
    Réponses: 13
    Dernier message: 25/09/2006, 12h36
  5. Mémoire après exécution du programme
    Par Woufeil dans le forum C++
    Réponses: 14
    Dernier message: 23/08/2006, 01h33

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