1 votes

Comprendre la mémoire

En C#, l'opération suivante permet-elle d'économiser de la mémoire ?

private List<byte[]> _stream;
public object Stream
{
    get
    {
        if (_stream == null)
        {
            _stream = new List<byte[]>();
        }
        return _stream;
    }
}

Edit : Désolé, je suppose que j'aurais dû être plus précis.

En particulier en utilisant "objet" au lieu de "liste"... J'ai pensé que ça serait un indice parce que c'est une chose bizarre à faire.

5voto

wprl Points 6139

Il économise une très petite quantité de mémoire. La quantité de mémoire qu'un appareil vide List<byte[]> va prendre la taille d'un octet.

La raison en est que votre variable de référence _stream doit seulement allouer suffisamment de mémoire pour contenir une référence à un objet. Une fois qu'un objet est alloué, il occupe une certaine quantité de mémoire qui peut augmenter ou diminuer au fil du temps, par exemple lorsque de nouveaux objets sont créés. byte[] sont ajoutés à l List . Cependant, la mémoire occupée par la référence à cet objet restera de la même taille.

Cette méthode est plus simple et moins sujette à des cas particuliers qui vous causent des maux de tête :

private List<byte[]> _stream = new List<byte[]>();
public object Stream
{
    get
    {
        return _stream;
    }
}

Bien que, dans la plupart des cas, il ne soit pas vraiment optimal de renvoyer des références à des membres privés lorsqu'il s'agit de collections/rays, etc. Il est préférable de renvoyer _stream.AsReadOnlyCollection() .

1voto

Joey Points 148544

Économiser de la mémoire par rapport à quoi ?

 byte[][] _stream;

peut-être ? Alors non, un List<T> occupera plus de mémoire puisqu'il s'agit d'un tableau (qui n'a pas nécessairement la taille exacte de son contenu, mais qui est généralement plus grand) et qu'un certain maintien de l'état doit également être effectué.

1voto

Victor Hurdugaci Points 3794

C'est un chargement paresseux. Vous ne créerez le flux que lorsque quelqu'un le demandera. Le flux (dans votre cas une liste) ne sera créé que si cela est nécessaire.

On pourrait dire qu'il permet d'économiser de la mémoire, car il n'en utilise que si nécessaire. Ainsi, avant d'utiliser le flux, aucune mémoire ne lui est allouée.

1voto

Eric Mickelsen Points 6332

Si votre édition indique que vous demandez si l'utilisation de la object au lieu du mot-clé List<byte[]> comme le type de la propriété permet d'économiser de la mémoire, non, ce n'est pas le cas. Et votre if ne permet d'économiser qu'une quantité négligeable de mémoire (et de processeur lors de l'instanciation). jusqu'à la première fois que la propriété est appelée. Et cela rend le premier appel à cette propriété légèrement plus lent. Envisagez de renvoyer un null à la place si cela a du sens pour la propriété. Et, comme l'a suggéré un autre répondant, il peut être préférable de garder la propriété en lecture seule, sauf si vous souhaitez que d'autres classes la modifient. En général, je dirais que les tentatives d'optimisation de ce type sont malavisées et rendent votre code moins facile à maintenir.

0voto

Paul Betts Points 41354

Etes-vous sûr qu'un Stream ne serait pas simplement un byte[] ou une liste de byte ? Ou encore mieux, un MemoryStream ? :) Je pense que vous êtes un peu confus, donc un exemple plus grand et quelques détails de scénario aideront beaucoup.

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