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 :

Obtenir la taille d'un tableau dynamique


Sujet :

C++

  1. #21
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    L'allocation consiste alors à 'marquer' (derrière ce terme, tout ce que vous voulez) un bloc comme 'occupé' et la libération à le marquer comme disponible
    Ça fonctionne toujours come ça, hein, même sur un bon vieux système d'exploitation de bureau... (sauf qu'il faut d'abord allouer des pages auprès de l'OS, qu'on redivise en blocs après).
    Le truc c'est que tu marques pas forcément qu'un bloc, mais éventuellement plusieurs blocs contigüs. (et c'est là la difficulté de l'allocation, trouver n blocs contigüs libres, c'est pas forcément facile).

    Là, il n'y a plus d'intérêt à connaitre la taille de l'allocation demandée au moment de la libération.
    Tout dépend de si tu la stockes dans ton allocateur ou pas combien de blocs ont été alloués.

    Mais delete[] n'a pas besoin de l'information de combien de mémoire a été allouée, mais de combien d'objets ont été construits, ça n'a rien à voir.

  2. #22
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Mais delete[] n'a pas besoin de l'information de combien de mémoire a été allouée, mais de combien d'objets ont été construits, ça n'a rien à voir.
    D'ailleurs... Je suis surpris que new et delete utilisent malloc.

    malloc a besoin de stocker quelque part la taille allouée (le plus souvent, dans les 4 octets qui précèdent le bloc il me semble) puisque free est non typé (void*).

    Mais new et delete sont typés. Quand on delete un objet, on sait qu'on doit libérer la taille de cet objet. Donc, il n'y a à priori pas besoin de cette information de taille (le cas du delete[] est différent, il a besoin de l'information de nombre d'éléments, mais là encore, pas de taille).

    Je loupe quelque chose, ou est-ce par "simplicité" que new utilise malloc ?

  3. #23
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    N'oublie pas qu'en POSIX, malloc() est LA primitive système pour l'allocation, donc il faut bien l'utiliser à un moment où un autre.

    Par contre, sous Windows, c'est vrai que ::operator new pourrait utiliser directement HeapAlloc()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    HeapAlloc stocke la taille du bloc mémoire alloué (sinon, je ne comprends pas comment marche HeapSize).

    Mais malloc se base sur d'autres primitives système (brk, mmap... notamment). On peut le réimplémenter, et on devrait pouvoir le réimplémenter pour qu'il ne stocke pas cette taille.

  5. #25
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Mais delete[] n'a pas besoin de l'information de combien de mémoire a été allouée, mais de combien d'objets ont été construits, ça n'a rien à voir.
    Tout à fait, mais à la base la question était :
    Citation Envoyé par Cbenlfun Voir le message
    Dans ce cas, je vais laisser ma classe string comme elle est et passer à autres choses, mais par pure curiosité, quelqu'un pourrait-il m'expliquer grossièrement (si cela est possible) comment les fonctions de désallocation dynamique (comme l'opérateur delete[] par exemple) font pour libéré la bonne quantité de mémoire.
    Et là, on ne discute pas du nombre d'objet pour lesquels le destructeur doit être appelé mais de quantité de mémoire.
    Merci de bien lire les questions

    [EDIT]: dans les systèmes embarqués où j'ai bossé, c'était plus bourrin: tu avais des pool de différentes tailles, et une allocation allait chercher un bloc dans le bon pool. Donc, impossible d'amalgamer des blocs consécutifs pour obtenir des tailles plus grandes. La taille max d'une allocation était donc bridée.

  6. #26
    Membre averti
    Homme Profil pro
    Développeur Autodidacte
    Inscrit en
    Janvier 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Autodidacte

    Informations forums :
    Inscription : Janvier 2008
    Messages : 46
    Par défaut
    Merci à tous pour vos réponses.

    Ma curiosité a été satisfaite.
    Je comprend un peu mieux cette gestion interne et toute la complexité qu'elle implique, mais je reste bien d'accord avec Médinoc:

    Citation Envoyé par Médinoc Voir le message
    Mais je reconnais que cette absence de méthode standard pour connaître la taille allouée est vraiment rageante, car ça t'oblige à rajouter ta propre gestion de la taille alors que la taille est déjà gérée au niveau inférieur. Résultat, ça fait une gestion redondante et tu te retrouves avec deux (ou plus)zones mémoire contenant la taille...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2007, 15h07
  2. Changer la taille d'un tableau dynamique
    Par clem1313 dans le forum Langage
    Réponses: 1
    Dernier message: 28/02/2006, 01h57
  3. Réponses: 6
    Dernier message: 16/01/2006, 13h29
  4. Comment récupérer la taille d'un tableau dynamique ?
    Par Tchaill39 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2005, 14h21
  5. Connaitre la taille d'un tableau dynamique
    Par lewellah dans le forum C
    Réponses: 2
    Dernier message: 23/09/2005, 18h37

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