2009-05-05 8 views
3

Ce n'est pas que j'aurais jamais besoin de faire cela, mais je veux comprendre comment cela fonctionne/ne fonctionne pas. J'ai googlé un peu pour la longueur maximale d'un tableau et ne peux pas vraiment trouver quelque chose.Taille maximale des baies .NET

long[] hugeArray = new long[long.MaxValue]; 

//No exceptions 
Console.WriteLine("Init"); 

//Overflow exception 
Console.WriteLine(hugeArray.LongLength.ToString()); 

hugeArray = new long[int.MaxValue]; 

//OutOfMemoryException 
Console.WriteLine(hugeArray.Length.ToString()); 

Et je suppose une question de suivi serait, s'il y a une limite et je suis en dehors de cette limite Initialisation, pourquoi pas une exception lors de la création que lorsque vous utilisez? Et est-ce quelque chose que le compilateur devrait attraper?

+0

duplication possible de [Quelle est la longueur maximale d'un tableau dans .NET sur Windows 64 bits] (http://stackoverflow.com/questions/2338778/what-is-the-maximum-length-of-an -array-in-net-on-64-bit-windows) – skolima

Répondre

3

Selon SpankyJ, .NET 2.0 avait au moins une limite de 2 Go par baie. 8 octets (sizeof long) * ~ 2^31 = 16 gigaoctets (sans parler de la mémoire réelle requise). En ce qui concerne le débordement, je suis d'accord avec marcc, probablement parce que les tableaux sont censés être indexés int (voir par exemple this method Bien que je sois un peu incertain à ce sujet, car this overload prend un tableau de longueurs Int64. disponible dans les versions ultérieures.

dans l'ensemble, cependant, cela est surtout une question théorique. Tout le monde en fait compter sur cela est susceptible de faire quelque chose de mal.

0

L'index d'un tableau est un int, pas long. Donc, je suppose que techniquement nouveau long [int.MaxValue] serait le maximum. Mais vous pouvez toujours obtenir l'exception OutOfMemoryException que vous voyez si vous manquez vraiment de mémoire. Courez-vous ceci sur un OS de 32 bits? Il n'y a pas de longueur maximale définie, sinon que la valeur de l'index est un int, pas un long.

5

IL opcodes sous-jacentes pour les tableaux accord avec IntPtr (connu sous le nom int natif dans la documentation IL):

  • newarr crée un tableau, et accepte un IntPtr
  • ldelem et stelem lecture et d'écriture des éléments, et ils utilisent un indice IntPtr
  • ldlen retourne la longueur d'un tableau, et il retourne un unsigned IntPtr

Je m'attendrais à une limite théorique sur le nombre d'éléments de 2^31-1 sur les plates-formes 32 bits, et 2^63-1 sur les plates-formes 64 bits.

Cependant, j'ai juste essayé ce code sur mon PC 64 bits, et j'ai obtenu un OutOfMemoryException sur la première allocation, donc clairement les limites pratiques sont plus petites.

Questions connexes