5 votes

Consommation de mémoire par les champs Static et Const

J'ai une classe dans laquelle j'ai un champ de type chaîne de caractères. Ce champ est constant et sera déplacé dans un fichier de ressources à l'avenir, mais pour l'instant il reste dans notre classe. Maintenant le scénario est que je fais plus de centaines d'objets de cette classe. Ma question est donc la suivante : quelle approche consomme le moins de mémoire et pourquoi ?

  1. Je devrais rendre ma chaîne variable static

    public class MyClass
    {
        public static string MyString = "My String";
    }
  2. Je devrais rendre ma chaîne variable const

     public class MyClass
     {
        public const string MyString = "My String";
     }

4voto

Donald Fraser Points 61

Il y a une différence. Les variables statiques sont initialisées dans l'espace mémoire dynamique et occupent donc un espace mémoire supplémentaire, sans parler du fait que vous avez besoin de code exécutable (mémoire supplémentaire) pour les initialiser et y accéder.

Toutes les données constantes sont situées dans le même espace mémoire que le code exécutable, qui est une mémoire morte (ROM), alors que les données statiques sont chargées dans une mémoire dynamique où vous pouvez potentiellement les lire et les écrire. Voici maintenant la partie intéressante qui semble avoir été négligée dans les réponses précédentes. Les données statiques occupent l'espace de la mémoire dynamique mais nécessitent un espace ROM supplémentaire et, dans le pire des cas, peuvent occuper deux fois plus de mémoire. Considérez ce qui suit :

class StaticData
{
    static string s_static1 = "My string data";
}

class ConstData
{
    const string CONST1 = "My string data";
}

La classe StaticData possède une variable s_static1 qui occupera l'espace mémoire dynamique d'un seul pointeur (normalement 1 entier). Cependant, elle doit également être initialisée et il doit donc exister un code ROM pour l'initialiser. Les données de la chaîne elle-même devraient normalement être situées dans l'espace ROM, puisque les données de la chaîne sont immuables, et ne prendraient pas plus de place que l'exemple de la constante.

Pour la classe ConstData, seul l'espace de stockage ROM est nécessaire et c'est donc, dans la plupart des cas, la meilleure utilisation de la mémoire.

La situation devient encore plus intéressante si l'on considère la façon dont les données sont utilisées par le compilateur. À l'exception des données de type chaîne ou caractère, les constantes sont normalement substituées directement dans le code au point de référence. En d'autres termes, la valeur de la constante est directement chargée dans un registre ou poussée sur la pile, selon l'utilisation. Dans le cas d'une variable statique, le compilateur doit lire cette valeur en mémoire via un code supplémentaire (référencement par pointeur) et, par conséquent, un code ROM supplémentaire est nécessaire.

En résumé, le code statique occupera plus de mémoire à la fois en occupant l'espace supplémentaire de la mémoire dynamique et l'espace supplémentaire du code exécutable nécessaire pour le déréférencer.

1voto

Shumail Mohy-ud-Din Points 1822

Je pense qu'il n'y aura pas de différence en ce qui concerne la mémoire. Dans les deux cas, la mémoire consommée sera la même. Mais il peut y avoir une certaine différence dans les performances - constant sera meilleur puisqu'il me semble que vous ne voulez pas la valeur de MyString pour être changé & un membre constant est défini au moment de la compilation et ne peuvent être modifiées au moment de l'exécution.

0voto

Nikita Brizhak Points 1898

Il n'y a pas de différence au niveau de la mémoire. Dans les deux cas, vous chargerez votre chaîne en mémoire une seule fois (si sa valeur n'y est pas déjà). Et en ce qui concerne les chaînes de caractères, il ne devrait pas y avoir de différence en termes de performances, comme l'a souligné KooKiz (il y en aura pour les types de valeurs, mais normalement vous ne devriez pas vous soucier de ce genre de micro-optimisation).

0voto

Jay Damani Points 1

Constant ne consomme pas de mémoire. Elle sera remplacée par la valeur définie au moment de la compilation. Alors que définir un membre comme statique consommera de la mémoire en fonction du type de données.

0voto

Adi Lester Points 10814

Les deux options utiliseront la même quantité de mémoire. La seule différence est que la première permettra de modifier MyString et la seconde ne le fera pas, ce qui est probablement ce que vous voulez.

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