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 :

question sur l'allocation sur le tas


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut question sur l'allocation sur le tas
    Bonjour
    j'ai tenté de regarder dans les profondeurs du code de VC2010 ce qui concerne l'allocation dynamique par exemple, quand on fait int*n=new int;

    J'ai vu que l'on appelle en fait une fonction qui s'appelle HeapAlloc.
    On ne peut pas aller plus loin dans le code, puisque cette fonction se trouve dans la dll kernel32.dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    __forceinline void * __cdecl _heap_alloc (size_t size)
    {
        if (_crtheap == 0) {
            _FF_MSGBANNER();    /* write run-time error banner */
            _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
            __crtExitProcess(255);  /* normally _exit(255) */
        }
        return HeapAlloc(_crtheap, 0, size ? size : 1);
    }
    On a cependant la déclaration de cette fonction dans winbase.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HeapAlloc(
        __in HANDLE hHeap,
        __in DWORD dwFlags,
        __in SIZE_T dwBytes
        );
    Je voudrais savoir si ces fonctions sont les fonctions communes à l'ensemble des applications de Windows, et comme le code n'est pas en open source, on ne peut pas y accéder.

    Cependant, j'ai trouvé ici quelque chose qui semble très proche.
    http://source.winehq.org/source/dlls/ntdll/heap.c#L1623

    Est-ce le code windows des fonctions dans les dll?
    Cela me semblerait quand même étrange. Serait-ce le code source de Windows?



    il semble qu'il y ait le code de toutes les fonctions de la dll concernant l'allocation sur le tas.

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    j'ai tenté de regarder dans les profondeurs du code de VC2010 ce qui concerne l'allocation dynamique par exemple, quand on fait int*n=new int;
    Visual n'étant pas open-source, tu vas avoir du mal à examiner son code source. Et même si tu pouvais, ca t'apporterait quoi ?

    Serait-ce le code source de Windows?
    Le code source Windows en libre accès ? Lol

    Ce que tu as vu, c'est Wine, un projet libre qui vise à faire tourner des programmes compilés pour Windows (typiquement des jeux) sous un environnement Linux. Pour ce faire, ils ont du recoder toute une architecture similaire à celle de Windows.

    Sinon, c'est quoi la question ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    deubelte, que cherchez-vous à savoir en fait ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    deubelte, que cherchez-vous à savoir en fait ?
    j'essaye de comprendre comment fonctionne l'allocation de mémoire.
    Comment cela se passe, parce que quand on fait new, il y a d'autres fonctions derrière. Cela ne se fait pas par magie.

    Le code source Windows en libre accès
    arf, il y a bien du avoir des fuites.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Non, juste de gros gros efforts de RE. (et donc de la doc a ssez poussée oui)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    j'essaye de comprendre comment fonctionne l'allocation de mémoire.
    Comment cela se passe, parce que quand on fait new, il y a d'autres fonctions derrière. Cela ne se fait pas par magie.
    new finit par appeler une fonction de l'OS qui alloue réellement la mémoire, comme ici HeapAlloc sous Windows.
    Si tu veux aller encore un peu plus loin et en savoir plus sur les algorithmes d'allocation de mémoire, il va falloir chercher un cours théorique plutôt que de mater des codes sources.

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    new finit par appeler une fonction de l'OS qui alloue réellement la mémoire
    >>Donc vaut mieux pas utiliser Heapalloc mais bien new, car cela risque de causer des pbs de portabilité dans un code..

    Pendant que j'y suis, on a souvent une déclaration et une définition de ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
    	{	// construct array with placement at _Where
    	return (_Where);
    	}
    où il y a une déclaration "normale" :
    inline void *__CRTDECL operator new(size_t, void *_Where)

    puis la définition, mais entre les deux, on voit qu'il y a une autre fonction, en l'occurrence _THROW0() dans le cas présent.
    Je voudrais savoir ce que c'est, à quoi cela correspond, et quand est-ce que c'est utilisé (dans quel cas....)

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par deubelte Voir le message
    >>Donc vaut mieux pas utiliser Heapalloc mais bien new, car cela risque de causer des pbs de portabilité dans un code...
    Non seulement ca, mais, surtout, new fait plus que, simplement, allouer de la mémoire...

    En effet, une grosse partie de son travail consiste en (*):
    1. la "séparation" des différents membres (à la base, l'allocation de mémoire fournit simplement un tableau de caractères... il faut donc décider de quel membre se trouve où dans le tableau )
    2. l'appel du constructeur acceptant les arguments donnés (s'il échoit), ce qui permet d'initialiser l'objet

    (*) sauf pour le placement new, qui est une technique assez rare d'utilisation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Question d'ordre général sur les macros sur excel
    Par tzehani dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 29/08/2007, 05h16
  2. Réponses: 11
    Dernier message: 06/03/2007, 19h18
  3. Réponses: 3
    Dernier message: 16/02/2007, 12h35
  4. Question sur l'allocation de mémoire
    Par Fonzy007 dans le forum Linux
    Réponses: 8
    Dernier message: 26/12/2006, 09h29
  5. question sur l'allocation dynamique
    Par velociraptor5679 dans le forum C++
    Réponses: 12
    Dernier message: 29/04/2006, 23h41

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