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

Framework .NET Discussion :

Stockage des objets en mémoire et taille des zones mémoires ocuppées


Sujet :

Framework .NET

  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Par défaut Stockage des objets en mémoire et taille des zones mémoires ocuppées
    Bonjour,

    je cherche à mieux comprendre l'environnement .NET.
    Je m'interroge sur le stockage en mémoire et la taille des zones mémoires occupées par les variables utilisées en .NET.
    On distingue deux sortes de types: les types valeurs stockés dans la pile et les types références stockés dans le tas.
    Le type valeur int est-il représenté sur 32 bits pour les proc 32 bits et sur 64 bits pour les proc 64 bits ?

    Avec l'instruction suivante:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    MyObject obj = new MyObject();

    j'instancie la classe MyObject et la référence est mémorisée par la variable obj car obj une variable de type référence.
    Quel est le mécanisme réalisé en mémoire ?
    Je suppose que l'objet instance de MyObject est stocké en mémoire et que la taille de cet zone mémoire dépend de l'objet.
    Je suppose aussi que la variable obj contient l'adresse de l'objet instancié, mais quelle est la taille de la zone mémoire occupé par cette variable ?

    La classe MyObject est défini comme suit:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MyObject
    {
       public int maVar;
    }

    La variable maVar est d'un type valeur mais je suppose que cette variable n'est pas stockée dans la pile mais dans le tas.
    Quelle est l'adresse de cette variable ? Est-elle liée à l'adresse de l'instance ?

    Je vous remercie par avance pour vos réponses.
    Menoto.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    - int est un alias sur le type Int32 en C#, donc ce sera du 32bits tout le temps

    - MyObject obj = new MyObject(); : instancie ton objet sur le tas managé, géré par le garbage collector. Le mécanisme peut-être plus ou moins complexe selon le type de ton objet et en particulier s'il possède un finalizer. Pour aller très vite l'espace mémoire nécessaire à ton objet est alloué sur le tas, puis le constructeur est appelé.

    - la taille de la zone mémoire (sur la pile) occupée par la référence à ton objet est (surement) celle d'un pointeur du système.

    - ta dernière question (remarque la précédente aussi) est une question d'implémentation. Je suppose qu'actuellement et si ton objet ne dérive pas d'une classe de base, alors l'adresse de maVar est la même que celle de l'instance qui l'encaspule. Mais c'est un détail d'implémentation dont tu ne devrais pas dépendre.

    Il y a un excellent bouquin (CLR via C# de jeffrey richter) qui rentre pas mal ddans les détails d'implémentation de .net. Peut-être aussi que cet article t'aidera.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Par défaut
    Bonjour,

    et merci pour ta réponse.
    Citation Envoyé par c#
    int est un alias sur le type Int32 en C#, donc ce sera du 32bits tout le temps
    Je m'étais dit que int était un alias sur le type Int32 pour les proc 32 bits et sur le type Int64 pour les proc 64 bits. Je trouvais ça logique.

    Est-ce qu'il est possible de savoir quelle est la taille mémoire occupée par un objet dans le tas ?

    la taille de la zone mémoire (sur la pile) occupée par la référence à ton objet est (surement) celle d'un pointeur du système
    La référence d'un objet est contenu dans la pile ? C'est bien ça ?

    La variable maVar est bien contenu dans le tas avec la classe ? N'est-ce pas ?
    Seules les variables locales et les paramètres des méthodes de types valeurs sont contenu dans la pile, c'est ça ?

    Est-ce qu'il est possible par programme de connaître la taille mémoire qu'occupe une variable ?

    Merci.

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tiens voila de la lecture (pour un moment) :
    http://drowningintechnicaldebt.com/b...-articles.aspx
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Par défaut

    Ah oui ça fait beaucoup de lecture.
    En même temps, je l'ai bien cherché avec mes questions.
    J'ai téléchargé aussi le document standard ECMA-335 Common Language Infrastructure qui est un très gros pavé.
    J'ai trouvé des réponses sur l'endroit où sont stockées les variables de types valeurs et de types références selon les cas, mais je n'ai rien trouvé sur les emplacements mémoires et les tailles mémoires occupées par ces variables. Savez-vous s'il existe une autre documentation officielle qui expliquerait tout ça ?
    Même si j'en ai déjà pas mal à lire avec les liens que vous m'avez donnée.

    Merci.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Je m'étais dit que int était un alias sur le type Int32 pour les proc 32 bits et sur le type Int64 pour les proc 64 bits. Je trouvais ça logique.
    La doc msdn indique que int est un alias sur Int32, sans préciser aucune plateforme. Ce serait à vérifier, simplement en faisant un sizeof d'une variable int sur deux plateformes. ça répond en partie a tes questions suivantes: on peut connaitre la taille des objets de type valeur de base avec l'instruction sizeof, mais ça ne marche pas avec des références.

    La référence d'un objet est contenu dans la pile ? C'est bien ça ?

    La variable maVar est bien contenu dans le tas avec la classe ? N'est-ce pas ?
    Seules les variables locales et les paramètres des méthodes de types valeurs sont contenu dans la pile, c'est ça ?
    Attention, je distingue l'objet lui même, de type référence et stocké sur le tas (y compris TOUS ses membres meme s'ils sont de type valeur), de la variable qui référence cet objet qui elle se trouve sur la pile et est un simple pointeur (effectivement dans le cas d'une variable locale).

    Est-ce qu'il est possible par programme de connaître la taille mémoire qu'occupe une variable ?
    Non je ne pense pas (à l'exécution), sauf comme écrit plus haut pour les types valeur de base. Tu peux en mode debug avec certaines extension au debugger connaitre la taille d'une variable en mémoire mais c'est tout (et encore je ne sais plus si tu récupères la taille totale, c'est à dire y compris la taille des variables membres de type référence ou pas)

  7. #7
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 31
    Par défaut
    on peut connaitre la taille des objets de type valeur de base avec l'instruction sizeof, mais ça ne marche pas avec des références.
    Au sujet de la taille des objets, j'ai obtenu un début de réponse avec l'article que tu m'as donné.

    Merci.

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

Discussions similaires

  1. Utilitaire pour obtenir la taille des objets Access
    Par =JBO= dans le forum Contribuez
    Réponses: 14
    Dernier message: 19/08/2023, 19h22
  2. [WCF] Limitation dans la taille des objets
    Par dev01 dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 30/08/2012, 08h18
  3. Service WCF, Silverlight et taille des objets
    Par Steven62 dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 18/08/2009, 10h57
  4. taille des objets en java
    Par tarik1099 dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2007, 20h59
  5. [FLASH 8] Taille des objets et zoom
    Par Yukio dans le forum Flash
    Réponses: 2
    Dernier message: 27/09/2005, 05h36

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