56 votes

Comment exactement champs statiques de travail à l'interne?

Disons que vous avez une classe,

class Foo
{
    public static bar;
}

Quand vous dites:

new Foo();

Je peux imaginer que dans la mémoire, un espace est réservé pour cet objet.

...et quand vous le dis encore une fois:

new Foo(); 

...eh bien maintenant vous avez un autre espace disponible pour l'objet.

Cependant, là où, précisément, le champ statique vivre?

Ce que je suis vraiment essayer d'apprendre, c'est:

Comment les références aux objets de référence le même champ des objets qu'ils référence?

106voto

Virtlink Points 12475

Bien que les détails exacts du type de système sont dépendant de l'implémentation, permettez-moi d'entrer dans plus de détails que tout en indiquant qu' il dépend et vous ne devez pas soin. Je vais vous décrire comment il fonctionne environ dans la mise en œuvre Microsoft (.NET), selon le livre CLR via C# par Jeffrey Richter et cet article.

Disons que vous avez une classe:

class Foo
{
    // Instance fields
    string myBar = "Foobar";
    int myNum;

    // Static fields
    static string bar = "Foobar";
    static int num;
}

Foo myFoo = new Foo();
Type typeOfFoo = typeof(Foo);

Où sont les champs d'instance de vivre?

Chaque fois que vous dites new Foo(), l'espace est alloué et initialisé pour l'instance de l'objet, et le constructeur est appelé. Cette instance est montré comme exemple de Foo dans l'image ci-dessous. Comme exemple contient uniquement les champs d'instance de la classe (dans ce cas - myBar et myNum), et pour les objets alloués sur le tas deux champs supplémentaires utilisés par le moteur d'exécution (Sync block index et Type handle). Le type de poignée est un pointeur vers un Type objet qui décrit le type de l'instance, dans ce cas, le type de Foo.

Quand vous dites new Foo() nouveau, un nouvel espace est alloué, ce qui aura pour contenir l'espace pour les champs d'instance du type. Comme vous pouvez le voir, les champs d'instance sont associés à des objets instances.

Le runtime place chaque instance de champ fixe à un décalage à partir du début des données de l'objet. Par exemple, myBar vivent à l'offset +4. L'adresse de l'instance de champ est tout simplement l'adresse de l'objet ainsi que le décalage du champ.

Où les champs statiques vivre?

Champs statiques en C# et Java ne sont pas associés à toute instance de l'objet, mais avec un type. Les Classes, les structures et les énumérations sont des exemples de types. Qu'une seule fois (par type) est l'espace alloué pour stocker les valeurs des champs statiques. Il serait judicieux d'allouer de l'espace pour les champs statiques dans l' Type structure qui décrit le type, car il n'y a aussi qu'un seul Type objet par type. C'est l'approche adoptée par C# et Java.

L' Type objet1 est créé lorsque le type est chargé par le runtime. Cette structure contient toutes sortes d'informations nécessaires à l'exécution pour être en mesure d'allouer de nouvelles instances, l'appel de méthodes et d'effectuer la coulée, entre autres choses. Il contient également de l'espace pour les champs statiques, dans ce cas - bar et num.

La durée de fonctionnement est de mettre chaque champ statique à un certain décalage à partir du début du type de données. C'est différent pour chaque type. Par exemple, bar vivent à l'offset +64. L'adresse de la statique de domaine est l'adresse de l' Type objet et le décalage du champ. Le type est connu statiquement.

Displays some object structures, and their relationships.

1) Dans Microsoft .NET plusieurs structures différentes de décrire un type, tels que la MethodTable et la EEClass structures.

16voto

Reed Copsey Points 315315

Cela dépend entièrement de la mise en œuvre en question. Pour C# et Java, l'exécution est autorisé à déterminer où stocker la mémoire de la variable. Pour la C et la plupart des langages compilés, le compilateur fait de cette détermination.

Cela étant dit, dans la pratique, il n'a pas d'importance. L'utilisation il est déterminé par la spécification, de sorte que vous êtes libre d'utiliser la variable de savoir le comportement sera garanti.

6voto

assylias Points 102015

Pour Java, les objets visés par les champs statiques de résider sur le tas comme les autres objets:

Le tas est le moteur d'exécution zone de données de la mémoire pour toutes les instances de classe et de tableaux est alloué.

Le domaine sera initialisé (si la déclaration contient une phase d'initialisation) lorsque la classe est chargée, ce qui se produit immédiatement avant la première occurrence de l'un des cas suivants:

  • une instance de la classe est créée.
  • une méthode statique déclaré par la classe est appelée.
  • un champ statique déclaré par la classe est affecté.
  • un champ statique déclaré par la classe est utilisé et que le champ n'est pas une constante variable (§4.12.4).

L'accès au champ statique se fait via 2 spéciales instructions de la JVM, getstatic et putstatic. Mais en dehors de cette distinction, les champs statiques sont à l'instar des champs statiques.

5voto

JerKimball Points 8994

Cela varie fortement d'une langue à l'autre, et peut même varier énormément d'une plateforme à une...

Par exemple, sur le .NET côté, les membres statiques sont "associés" avec le conseil d' EEClass définition, qui peuvent être allouées sur la pile OU un "où" alloués membre (le C# spec ne spécifie pas de segment de mémoire/pile comportement, c'est un détail de l'implémentation de la machine virtuelle)

4voto

Jens Kloster Points 3974

Im seulement familier avec le C#, et c'est ma compréhension de celui-ci:

Alors votre programme démarre, il charge toutes les assemblées dans un domaine d'application. Lorsque le assambly est chargé, tous les constructeurs statiques sont appelés, y compris les champs statiques. Ils vivront dans la il y, et la seule façon de les décharger, est de décharger le domaine d'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X