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 :

Malloc semble allouer plus de mémoire que nécessaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    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
    Par défaut Malloc semble allouer plus de mémoire que nécessaire
    Bonjour,

    Je souhaite essayer de comprendre comment la mémoire est allouée par malloc en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int c;
        system("pause");
        for(c=0; c<1024; c++)
        {
            char* tmp = malloc(8);
            //char* tmp = calloc(8, sizeof(char));
            //printf("%d\n", _msize(tmp));
            tmp[0] = '\0';
        }
        system("pause");
        exit(-1);
    Soit le programme suivant dans le main. Normalement je devrais allouer 1024*8 octets = 8192 octets = 8 Ko
    Or dans le gestionnaire de mémoire de Windows 7, mon programme alloue 16 Ko de mémoire entre mes deux system("pause").

    J'ai d'abord pensé aux alignements mémoire mais 8 étant un multiple de 8, normalement, il ne devrait pas y avoir d'alignement.

    Je voudrais comprendre pourquoi j'ai deux fois plus de mémoire allouée sachant que j'ai besoin d'optimiser la mémoire de mon programme.

    PS : J'ai testé aussi avec 45 000 000 d'itérations dans la boucle for, même problème, j'ai deux fois plus de mémoire allouée au final.

    Merci d'avance
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour
    Il me semble que c'est normal et cela est peut-être dû aux données d'alignement essayer de faire un cast sur la valeur de retour et tester éventuellement si l'allocation est correcte.
    Cependant, je ne comprends pas trop l'intérêt d'effectuer une allocation avec une valeur constante dans une boucle ?
    y a-t-il pas écrasement d'adresse d'allocation à chacun itération ?

    Citation Envoyé par Aspic Voir le message
    for(c=0; c<1024; c++)
    {
    char* tmp = malloc(8);
    //char* tmp = calloc(8, sizeof(char));
    //printf("%d\n", _msize(tmp));
    tmp[0] = '\0';
    }
    Il est plutôt préférable d'effectuer une seule allocation et ainsi utiliser cette adresse autrement exemple:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( void ){
     
    	char *ptr = NULL;
    	unsigned int i = 0;
    	const size_t size = 127;
     
    	ptr = (char*)malloc( size * sizeof(char) );
    	if( (NULL) == ptr ){
    		perror("Erreur Allocation mémoire\n");
    		exit( EXIT_FAILURE );
    	}
     
    	for( i = 0; i < size; i++ )
    		*(ptr+i) = (char)i;
    	for( i = 0; i < size; i++ )
    		printf( "(%d)\t:%c\n", i, *(ptr+i) );
     
    	free( ptr );
    	ptr = NULL;
     
    	return( EXIT_SUCCESS );
    }
    à bientôt

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

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

    Il n'y a pas un malloc en C. Il y a différentes stratégies d'allocation de mémoire suivant la plateforme et la libc utilisée. Pour avoir plus d'infos, comme tu sembles utiliser windows, il faudrait creuser sur MSDN si tu trouves tes réponses, wikipedia ne présentant que les differentes stratégies sur quelques unix.

  4. #4
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    En complément regardez également du coté Windows
    à bientôt

  5. #5
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Salut,

    Comme dit plus haut, impossible de te répondre avec exactitude sans avoir plus d’info.

    De manière générale, un allocateur alloue toujours des métadonnées (leur localisation et leur taille dépend de l’allocateur utilisé) en plus de la mémoire que tu lui demandes.
    Ici tu alloues des blocs de 8 octets, si l’allocateur alloue 8 octets de métadonnées pour chaque allocation, ça pourrait expliquer ton x2 en taille.
    Est-ce que tu as toujours ce facteur de x2 en allouant des blocs de 64Ko ?

    Je te donne une explication parmi d’autres (elle est peut être fausse), il faut lire la documentation de l’allocateur utilisé (je ne connais pas trop le monde Windows…) pour savoir exactement ce qu‘il se passe.

  6. #6
    Membre Expert
    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
    Par défaut
    Bonjour à tous,

    Voilà plus d'informations :

    Je compile mon programme sous GCC version 4.7.2 avec MinGW avec CodeBlocks pour être exact
    Je compile en Release avec l'option -O2 pour l'optimisation.

    Je ne travaille donc pas avec Visual studio et son compilateur propriétaire.

    En testant avec 1024 malloc de blocs mémoire de taille 64, je devrais en théorie avoir 1024*64 = 65536 octets = 64 Ko et j'ai en mémoire en réel : 76 Ko soit une différence de 12 Ko

    Avec 1024 malloc de blocs mémoire de taille 128 => 1024*128 = 131072 octets = 128 Ko. En vrai, j'ai 156 Ko d'alloué soit une différence de 28 Ko.

    Je ne sais pas si on peut établir une "loi" en fonction de la taille du bloc mémoire mais en tout cas, il semble bel et bien y avoir des métadonnées allouées. Y'a t-il un moyen d'en savoir plus au niveau du code ?

    Ca m'embête un peu sachant que je dois allouer 45 000 000 de chaines de caractères de taille 21 (20 octets utiles + '\0'). Je ne sais pas comment optimiser cela pour prendre le moins de mémoire possible avec GCC...

    Merci

    EDIT: Je viens de tester avec mes 45 000 000 de chaines de 21 octets, en théorie : 922 851Ko de mémoire et en vrai : 1 410 556 Ko, ca fait quand même une différence énorme de 487 704 Ko (476 Mo) !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    En complément regardez également du coté Windows
    à bientôt
    Extraction de la substantifique moelle de ton lien :
    La fonction malloc alloue un bloc de mémoire d'au moins size octets. Le bloc peut être plus grand que size octets en raison de l'espace requis pour les informations d'alignement et de maintenance.

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    D'accord !
    C'est donc normale ?
    j'avais des doutes sur mon tout premier poste. Encore un cas qui donne raison au cast de la fonction malloc
    à bientôt

  9. #9
    Membre Expert
    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
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Extraction de la substantifique moelle de ton lien :

    La fonction malloc alloue un bloc de mémoire d'au moins size octets. Le bloc peut être plus grand que size octets en raison de l'espace requis pour les informations d'alignement et de maintenance.
    Ouais j'avais déjà lu cela donc au final c'est mort, on ne peut rien y faire ? y'a pas une option/flag de GCC pour réduire cela ?
    Citation Envoyé par sambia39
    j'avais des doutes sur mon tout premier poste. Encore un cas qui donne raison au cast de la fonction malloc
    Je n'ai pas compris, que l'on cast ou pas le retour de malloc, la quantité mémoire est la même.
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Réponses: 126
    Dernier message: 11/03/2010, 08h12
  2. Allouer plus de mémoire pour les mises à jour.
    Par Empty_body dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 14/03/2008, 15h29
  3. [C#]Comment allouer plus de mémoire à mon prog
    Par Yotho dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/04/2007, 11h39
  4. allouer plus de mémoire
    Par fontaigo dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 05/02/2007, 16h54
  5. [DOS][Mémoire] Allouer plus de 64 Ko
    Par Pascool dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 10h26

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