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.
1) Dans Microsoft .NET plusieurs structures différentes de décrire un type, tels que la MethodTable et la EEClass structures.