5
votes

Où la mémoire est-elle allouée pour les champs statiques, constants et en lecture seule?

J'ai utilisé les trois champs du programme et j'ai trouvé la différence d'utilisation, mais je ne sais pas trop où ces champs sont stockés? soit dans un segment de données (pile ou tas?) ou un segment de code?

static int a;
const int b=1235;
readonly int c;

dans ILDASM, les champs sont décrits comme suit

pour static: .field private static int32 a

pour constant: .field private littéral statique int32 b = int32 (0x000004D3)

pour lecture seule: .field private initonly int32 c


3 Réponses :


3
votes

3 commentaires

Merci pour la réponse, pouvez-vous expliquer la constante d'allocation de mémoire et les champs en lecture seule?


@gurunagsai vous avez évidemment déjà vérifié le sont classées comme membres statiques , de sorte que la partie est claire et en lecture seule ne modifie pas l'allocation - ce message répond également à cette question pour les champs statiques en lecture seule (en supposant que vous le sachiez déjà comment les champs d'instance sont stockés)


@AlexeiLevenkov Merci pour la réponse.



3
votes

Comme vous le savez, const est statique, ce qui signifie qu'il est stocké dans le tas. Readonly est comme un membre. Comme tout autre membre, la valeur de readonly est également stockée sur le tas. Pour toute référence furthur sur const et en lecture seule, reportez-vous au lien ci-dessous. https://blogs.msdn.microsoft.com/csharpfaq/2004/12/03/what-is-the-difference-between-const-and-static-readonly/


4 commentaires

Merci d'avoir répondu


Une chose qui m'intéresse personnellement: est-ce que "lecture seule" agit de la même manière que "privé / public", etc.? Est-ce juste une aide du compilateur .NET? Vous pouvez toujours modifier les valeurs privées de l'extérieur par réflexion, même si elles sont déclarées privées. En va-t-il de même pour «lecture seule»?


@Jannik lecture seule ne peut être modifié qu'au moment de l'exécution ou en utilisant un constructeur non statique


C'est un peu trompeur. Les champs Const sont intégrés dans le code compilé. Il est trompeur de dire que les membres const sont stockés dans le tas; Ils ne sont potentiellement stockés que dans la page de codes et sont généralement intégrés par le compilateur.



1
votes

CLR est le composant de base et la machine virtuelle du .NET Framework. C'est l'environnement d'exécution dans le .NET Framework qui exécute les codes et facilite le processus de développement en fournissant les divers services. Le CLR divise la mémoire en trois régions distinctes: la pile, le tas et le tas haute fréquence. Les objets statiques doivent survivre à une collection GC et sont stockés dans le tas haute fréquence. Les objets statiques et constants sont stockés dans le tas du chargeur tels qu'ils existent dans la mémoire pendant toute la durée de vie de l'application; ils n'ont pas besoin d'être ramassés.


0 commentaires