Maison >développement back-end >C++ >Tas ou pile : où « new » alloue-t-il de la mémoire pour une structure C# ?

Tas ou pile : où « new » alloue-t-il de la mémoire pour une structure C# ?

DDD
DDDoriginal
2025-01-13 15:16:41685parcourir

Heap or Stack: Where Does `new` Allocate Memory for a C# Struct?

Lorsque vous utilisez le mot-clé "new" pour créer une structure en C#, la mémoire est-elle allouée sur le tas ou sur la pile ?

Lors de la création d'une instance de classe à l'aide de l'opérateur "new", la mémoire est allouée sur le tas. Mais lorsque vous utilisez l'opérateur « nouveau » pour créer une instance de structure, où la mémoire est-elle allouée ?

Mémoire de pile et mémoire de tas

La pile est une structure de données utilisée pour stocker les variables locales et les appels de méthode pendant l'exécution du programme. Il s'agit d'une structure LIFO (dernier entré, premier sorti), ce qui signifie que la mémoire la plus récemment allouée est supprimée en premier.

Le tas est un espace mémoire dynamique où les objets sont créés et alloués selon les besoins. Contrairement à la pile, elle ne suit pas d’ordre précis d’allocation de mémoire.

Utilisez le mot-clé "new" pour créer une allocation de mémoire pour la structure

Pour les structures, lors de l'utilisation de l'opérateur "nouveau", il faut considérer deux situations :

  1. Constructeur sans paramètres (new Guid();):

    • L'utilisation de l'opérateur "new" et du constructeur sans paramètre alloue de la mémoire pour la structure sur le heap.
    • Cela est dû au fait que le compilateur C# traite les constructeurs sans paramètre comme un cas particulier, les traitant comme des opérations d'initialisation nulle.
    • Par conséquent, un nouvel emplacement mémoire est créé sur le tas et la structure y est construite.
  2. Constructeur avec paramètres (new Guid(someString);):

    • L'utilisation de l'opérateur "new" et du constructeur paramétré alloue de la mémoire sur la pile pour le stockage temporaire.
    • Une fois que le constructeur a initialisé la structure, la mémoire de pile allouée sera supprimée.
    • Ce processus est différent de l'attribution d'une structure instanciée à une variable locale, qui alloue de la mémoire sur le tas, tout comme un constructeur sans paramètre.

Génération de code IL

Pour comprendre ce qui se passe dans les coulisses, examinons le code de langage intermédiaire (IL) généré par le compilateur C# :

    La directive
  • newobj alloue de l'espace sur la pile et appelle un constructeur paramétré pour les valeurs intermédiaires (par exemple, les paramètres de méthode).
  • La directive
  • call instance initialise un emplacement de stockage alloué (pile ou tas) à l'aide d'un constructeur paramétré.
  • L'instruction
  • initobj initialise un emplacement de stockage alloué (pile ou tas), remettant son contenu à zéro (pour les appels de constructeur sans paramètre).

Conclusion

En résumé, contrairement aux instances de classe qui allouent toujours de la mémoire sur le tas, l'utilisation de l'opérateur "new" sur une structure allouera de la mémoire sur le tas dans le cas d'un constructeur sans paramètre et dans le cas d'un constructeur paramétré. sur la pile (pour le stockage temporaire). Ce comportement se reflète dans le code IL généré et donne un aperçu du processus de gestion de la mémoire sous-jacent.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn