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 :

Problème occupation mémoire


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Problème occupation mémoire
    Bonjour,

    je suis en train de réaliser des petits bouts de code et je me suis rendu compte qu'un simple programme occupe un peu trop de RAM à mon goût:

    voici un exemple classique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdlib.h>
     
    int main(void)
    {
     
     system("pause");
      return 0;
    }
    => occupe 1008 kilo de ram

    et celui ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdlib.h>
     
    int main(void)
    {
     
     while(1){
        /*nothing*/
     }   
      return 0;
    }
    => occupe 672 kilo de ram

    ma question: Comment cela est-il possible ? J'ai essayer avec différents flags d'optimisation etc: idem !

    Quelqu'un a-t-il une idée svp ?
    Dernière modification par TheGzD ; 24/06/2011 à 15h50. Motif: Remplacement des balises [QUOTE] ... [/QUOTE] par [CODE] ... [/CODE]

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 107
    Par défaut
    slt,

    Essaye les options d'optimisation -fdata-sections et -ffunction-sections pour GCC.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    la reponse est simple : dans le premier exemple tu utilise la fonction system() qui en fait lance un shell et execute la commande transmise en parametre a ce shell. Dans le deuxieme tu fait juste une boucle infini c'est a dire une simple verification de condition.

    Il est donc normal qu'un shell occupe plus de memoire qu'une verification d'expression.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    la reponse est simple : dans le premier exemple tu utilise la fonction system() qui en fait lance un shell et execute la commande transmise en parametre a ce shell. Dans le deuxieme tu fait juste une boucle infini c'est a dire une simple verification de condition.

    Il est donc normal qu'un shell occupe plus de memoire qu'une verification d'expression.
    Oui mais 600kilo pour le 2eme exemple c'est quand meme bizzard ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par défaut
    Essaies de ne pas inclure stdlib.h

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Vodsky Voir le message
    Essaies de ne pas inclure stdlib.h
    Idem ...

    Il y a vraiment quelque chose d'étrange ....

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 577
    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 577
    Par défaut
    (J'ai vu passer GCC donc je suppose que tu travailles sous Unix)

    Il y a plusieurs choses qui peuvent occuper de la mémoire.

    Essaie déjà « strip -s » sur ton fichier exécutable pour supprimer tous les symboles.

    Ensuite, vois du côté de « ulimit -a » qui te donnera toutes les limites appliquées à un processus lors de son lancement. Notamment la taille de la pile, ce qui devrait répondre à une autre de tes questions.

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Obsidian
    (J'ai vu passer GCC donc je suppose que tu travailles sous Unix)
    Raté, le system("pause") est une windowserie . D'ailleurs, "gcc" existe sur de nombreuses plateformes, y compris windows (MinGW, Cygwin GCC, etc.), et non pas seulement linux, même si la version linux est toujours plus complète et plus à jour que dans les autres systèmes.

    PlayBoy31 : Je n'ai pas encore pu vérifier si 672 K de RAM c'est normal ou non pour une application console qui n'exécute qu'une boucle infinie, mais je pense que ça l'est. Je vérifierai ce soir. Autre chose, on ne sait pas quelles "optimisations" as-tu déjà faites. Est-ce que tu compiles déjà en release ou en debug par exemple. Quel compilateur utilises-tu.

    Citation Envoyé par Vodsky
    Essaies de ne pas inclure stdlib.h
    Ca c'est clair que ça ne servira à rien. L'inclusion d'un fichier d'en-tête n'entraîne pas l'inclusion des fonctions déclarées dans l'exécutable, sinon les fichiers exécutables seraient toius très volumineux ...

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 577
    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 577
    Par défaut
    Citation Envoyé par Melem Voir le message
    Raté, le system("pause") est une windowserie
    Je l'ai vu aussi mais j'ai supposé qu'il s'agissait d'une habitude.

    Ca c'est clair que ça ne servira à rien. L'inclusion d'un fichier d'en-tête n'entraîne pas l'inclusion des fonctions déclarées dans l'exécutable, sinon les fichiers exécutables seraient toius très volumineux ...
    Pas forcément. L'inclusion de certains fichiers peut provoquer des effets de bord, notamment en définissant des directives qui sont ensuite interprétées par les bibliothèques standard ou, surtout, par le compilateur lui-même… Par exemple, des changements dans _POSIX_SOURCE, _GNU_SOURCE, etc. ou des #pragma quelconques.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par défaut
    J'ai fait le test, je suis sous win7 je compile avec visual studio c++ (sa devrai pas trop influer sur le résultat je pense).

    J'ai tester avec la boucle inf, avec et sans le stdlib.h, je passe de 416ko a 352ko.

    Remarque :j'ai pas tes 600 ko et en plus je compile en mode debug, tu est sous quel OS?

    Je rajoute, voila ce qu'on peut trouver dans un .h (je précise que c'est celui de visual studio donc je sais pas si c'est une généralité ^^):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #if !defined(_M_CEE_PURE)
    /* a invalid_arg handler procedure. */
    typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t); 
     
    /* establishes a invalid_arg handler for the process */
    _CRTIMP _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(_In_opt_ _invalid_parameter_handler _Handler);
    _CRTIMP _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
    #endif
    ça ressemble a un truc qui est sensé s’exécuter non? c'est étrange tout de même.

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    L'inclusion de certains fichiers peut provoquer des effets de bord, notamment en définissant des directives qui sont ensuite interprétées par les bibliothèques standard ou, surtout, par le compilateur lui-même… Par exemple, des changements dans _POSIX_SOURCE, _GNU_SOURCE, etc. ou des #pragma quelconques.
    Ah oui je n'y ai pas pensé. Sur le moment, je ne voyais que les déclarations de fonctions en fait.

    Vodsky :

    - #if !defined(_M_CEE_PURE) ... #endif sert à inclure la portion de code entourée si et seulement si la macro _M_CEE_PURE est définie.

    - typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t); définit le type _invalid_parameter_handler, qui est alors un pointeur de fonction.

    - Enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    _CRTIMP _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(_In_opt_ _invalid_parameter_handler _Handler);
    _CRTIMP _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
    Ces deux lignes sont des déclarations de fonction.
    - _CRTIMP est un define de __declspec(dllimport). Il permet d'indiquer au compilateur que le corps de la fonction se trouve dans une DLL.
    - __cdecl est la convention d'appel utilisée
    - _In_opt_ est une macro vallant vide et sert juste à indiquer que le paramètre qui suit est un paramètre d'entrée ("in" parameter), ce qui signifie que la fonction ne modifie pas "l'objet pointé" malgré l'abscence du mot-clé const et qu'il est optionnel, ce qui signifie que passer NULL a un sens pour le fonction.

    En gros, ce ne sont que des déclarations, et pas une seule instruction.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par défaut
    Je suis toujours ravi d'apprendre!

    Merci

Discussions similaires

  1. Problème occupation mémoire d'une matrice dans un bus creator
    Par maoussecostaud dans le forum Simulink
    Réponses: 1
    Dernier message: 22/06/2009, 12h13
  2. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  3. différence entre varchar et text pour l'occupation mémoire
    Par champion dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/12/2004, 18h02
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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