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 :

Allocation maximale de mémoire pour un programme


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut Allocation maximale de mémoire pour un programme
    Bonjour,

    Je suis entrain de faire un petit test pour savoir s'il y a une limite au niveau de l'allocation de mémoire dans un programme en C.
    Il semble d'après mes recherches que les seules limites soient la RAM physique installée et si le système est en 32 ou 64 bits.
    Mon PC sous Windows 7 est en 64 bits et mon compilateur (gcc) compile en 32 bits (je suppose car sizeof(int) = 4 octets chez moi).
    Je peux donc théoriquement avoir 2^32 adresses mémoire disponible pour mon programme.

    Voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int* tab;
        int i;
        const int mega = 1024*1024;
        for (i=0; i<1000000; i++)
        {
            tab = (int*)malloc(mega*sizeof(int));
            if (tab)
            {
                tab[0] = 50;
                printf("i=%d\n", i);
            }
        }
        printf("fin");
    En sortie, je peux aller jusqu'à 480 sur mon PC ! Je suis très étonné, ca ne fait que 1Mo * 4 * 480 = 1920 Mo de mémoire alloué avant que malloc échoue...

    Si je diminue la constante méga en mettant 1024 au lieu de 1024*1024, en sortie, mon compteur affiche 499 050, ce qui donne 1Ko * 4 * 499 050 = 1 996 200Ko = 1949 Mo

    On est pas très loin du 1er test, mais pourquoi ne puis-je pas avoir plus de mémoire alors que j'ai 8 Go de RAM installé donc 4Go disponible ?

    Merci à vous

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    En 32bits, tu n'as accès qu'à ~3.4 Go de ram
    Il faut compiler en 64bits pour avoir le bon résultat.

    Sache que sous certains systèmes 64bits, notamment windows, un int peut reste sur 4 octets (cf fundamental types sur cppreference.com)

  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Même avec 3,4 Go de ram pour un programme 32 bits, je suis moins du compte avec mes 1949 Mo...
    Comment cela se fait il ?

    En fait, mon but n'est pas de compiler en 64 bits mais de pouvoir utiliser le Max de ram à savoir 3,4 Go pour mon programme 32 bits.

    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Oui, par défaut Windows (et surement d'autres systèmes) ne laisse qu'un espace d'adressage d'environ 2 Go à une application 32bits.
    Il y a un ou deux flags de compilation à spécifier.
    Voici un article qui en parle (désolé c'est en anglais). Je ne sais rien de plus à ce sujet, désolé:
    http://blogs.msdn.com/b/oldnewthing/...01/423817.aspx

    Edit: Pardon je dis une bêtise: l'espace d'adressage est de 4 Go (en 32 bits) mais l'allocation est limité à 2Go à moins d'utiliser les flags dont j'ai parlé plus tôt.

  5. #5
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    Citation Envoyé par Aspic Voir le message
    ...
    Je suis entrain de faire un petit test pour savoir s'il y a une limite au niveau de l'allocation de mémoire dans un programme en C.
    Il semble d'après mes recherches que les seules limites soient la RAM physique installée et si le système est en 32 ou 64 bits.
    ...
    Je peux donc théoriquement avoir 2^32 adresses mémoire disponible pour mon programme.
    ...
    La méthode la plus classique en C pour «allouer de la mémoire» (=passer par une fonction de la libc pour demander à l'OS de réserver au processus une plage contigüe de mémoire dans le tas) est d'utiliser la fonction void * malloc (size_t size). L'argument size est de type size_t qui suivant la plateforme cible est un entier non signé de 32 ou 64 bits qui représente la taille en octets de l'espace demandé. La plus petite valeur que la norme C11 impose pour le maximum demandable SIZE_MAX est 65535 (§7.20.3.2 Limits of other integer types dans le draft C11). Tu peux donc demander jusqu'à 2³² octets en mode 32 bits ou 2⁶⁴ octets en mode 64 bits sans dépasser la limite SIZE_MAX. La manière dont l'OS réagit à cette demande ne dépend que de l'OS , du matériel et de leur configuration. Là je ne te donne que le point de vue en C.

    Citation Envoyé par Aspic Voir le message
    ...
    Mon PC sous Windows 7 est en 64 bits et mon compilateur (gcc) compile en 32 bits (je suppose car sizeof(int) = 4 octets chez moi).
    ...
    La taille des pointeurs donnera a priori le résultat, pas celle d'un int. Utilise plutôt un sizeof (void *).

    Tu trouveras dans la doc gcc les options qui te permettront de contrôler le type de modèle :

    These ‘-m’ switches are supported in addition to the above on x86-64 processors in 64-bit environments.

    -m32
    -m64
    -mx32
    -m16
    Generate code for a 16-bit, 32-bit or 64-bit environment.

    The -m32 option sets int, long, and pointer types to 32 bits, and generates code that runs on any i386 system.

    The -m64 option sets int to 32 bits and long and pointer types to 64 bits, and generates code for the x86-64 architecture. For Darwin only the -m64 option also turns off the -fno-pic and -mdynamic-no-pic options.

    The -mx32 option sets int, long, and pointer types to 32 bits, and generates code for the x86-64 architecture.

    The -m16 option is the same as -m32, except for that it outputs the .code16gcc assembly directive at the beginning of the assembly output so that the binary can run in 16-bit mode.

  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Merci à tous pour vos réponses.

    J'ai réussi à utiliser mes 4Go de RAM pour mon programme

    AU moins, j'aurais appris un truc, c'est que malloc de base, ne peut fournir que 2Go de RAM pour un programme ce qui est de toute évidence largement suffisant pour 98% des applications

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/03/2011, 18h59
  2. Réponses: 5
    Dernier message: 26/11/2010, 15h37
  3. Réponses: 6
    Dernier message: 24/03/2006, 18h24
  4. Réponses: 3
    Dernier message: 30/01/2006, 10h52

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