Allocation mémoire de la structure par new
opérateur en C# : tas ou pile ?
Lorsqu'une classe est instanciée à l'aide de l'opérateur new
, la mémoire est allouée sur le tas. Cependant, le comportement de l'opérateur new
sur les structures dépend du scénario spécifique. Explorons les différences :
Constructeur avec paramètres
Lors de l'appel du constructeur paramétré d'une structure à l'aide de new
, la mémoire est allouée sur la pile. Ceci est similaire à l’attribution d’une valeur à une variable locale d’un type valeur.
<code class="language-csharp">Guid local = new Guid("");</code>
Le code IL attribué utilise newobj
pour allouer de la mémoire sur la pile et initialiser la valeur à l'aide de la chaîne fournie.
Constructeur sans paramètres
Lors de l'appel du constructeur sans paramètre d'une structure à l'aide de new
, le comportement dépend du contexte :
Aucune mémoire ne sera allouée sur la pile. Utilisez plutôt initobj
pour initialiser un emplacement de stockage existant (champ ou variable locale). Les types de valeur sont construits sur place.
<code class="language-csharp">Guid field; ... field = new Guid();</code>
Allouez une variable locale temporaire sur la pile et initialisez-la à l'aide de initobj
. Cette valeur est ensuite passée en paramètre à la méthode.
<code class="language-csharp">MethodTakingGuid(new Guid());</code>
Aucune mémoire ne sera allouée sur la pile. Les types valeur sont construits directement à l’emplacement de stockage de l’instance ou de la variable statique.
<code class="language-csharp">myInstance.GuidProperty = new Guid();</code>
Conclusion
Le comportement d'affectation de l'opérateurnew
lorsqu'il est utilisé avec une structure dépend du contexte. Pour les constructeurs avec paramètres, la mémoire est toujours allouée sur la pile. Pour les constructeurs sans paramètre, la mémoire peut ne pas être allouée sur la pile, selon le contexte. Ce comportement dépend fortement des directives IL générées par le compilateur lors de la conversion du code C#.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!