2015-09-05 1 views
9

Je suis assez nouveau pour le problème de mémoire. J'espère que vous ne pensez pas que c'est une question stupide à poser.C# Grand objet dans la collection de taille moyenne

Je sais que la mémoire plus de 85.000 octets seraient mis en LOH en C# -à-dire

Byte[] hugeByteCollection = new Byte[85000]; 

Je me demande si une collection avec la taille 1-20000 avec un objet qui contient 10 variables membres (octet type) sera mis en LOH ou SOH?

Répondre

4

La taille d'un tableau d'objets correspond au nombre d'objets multiplié par la taille du pointeur. En effet, seuls les types de valeur sont stockés dans le tableau lui-même, les types de référence (objets) seront stockés ailleurs et ne seront pas pris en compte dans la taille du tableau. Donc 85000/4 = 21250 objets, et 85000/8 = 10625 objets peuvent être stockés dans un tableau sur le SOH en mode 32 bits et 64 bits, respectivement. Merci à Hans Passant de faire remarquer que cela suppose que le type de collection utilisé est un tableau et non une liste. Les listes se redimensionnent pour être plus grandes que le contenu afin d'éviter trop d'allocations. Voir this link pour les détails

+1

Ce type de math ne fonctionne pas pour les types de collection, il est en fait 16 384. Cochez [cette réponse] (http://stackoverflow.com/a/2248188/17034) pour plus de détails. –

+0

Merci pour votre commentaire! Le redimensionnement dont vous parlez ne concerne que les listes, pas les tableaux, donc pas directement liés à cette question. Mais encore, je devrais avoir ajouté l'avertissement –

+0

donc afin de garder la liste dans SOH pour la liste qui contient un grand nombre d'objets Nous devons trouver une liste partitionnée qui contient un tableau de liste. PartitionList va créer dynamiquement une nouvelle liste et ajouté à l'arry lorsque la liste dépasse la capacité de 10000 Cela fonctionnera-t-il? – cscmh99