2012-09-03 20 views
7

Duplicar posible:
Memory footprint of Haskell data typesuso de la memoria de los constructores en Haskell

Al resolver problemas combinatorios, que representa a menudo la solución como una cadena de bits, por ejemplo. 1010100010110111000110 ... Ya entiendo la imagen.

que pensé que cuando uso [Int] para la cadena de bits, Int siempre gasta la misma cantidad de memoria, no importa cuán grande es el número realmente es (porque Int que está delimitada, en contraste con Integer), ya que el equipo sólo se acuerda la representación de bit, y String tomarían aún más espacio por lo que sé.

Mi idea era entonces para usar el tipo de datos

data Bits = Empty | Zero Bits | One Bits deriving (Eq,Ord,Show) 

Pero la cantidad de memoria hacen los constructores Empty, Zero y One manejar en comparación con Int 's?

+2

Un 'Int' siempre es 32 o 64 bits, por lo que no puede almacenar números arbitrariamente grandes. 'Entero ', por otro lado, no tiene límites. – huon

+5

Irrelevante a su pregunta, pero hay Data.Bits que tiene cosas bitfield – Squidly

+0

@dbaupp: Sé que, es por eso que lo quería en comparación con sólo 'Int' – Undreren

Respuesta

10

Int cuesta dos palabras en la memoria (#I constructor y #Int de campo), sus datos Bits puede utilizar varios costos, por ejemplo: Zero (One (Zero Empty)) cuesta:

  1. Una palabra para Empty constructor
  2. Dos palabras para Zero Constructor y campo
  3. Dos palabras para One Constructor y campo
  4. Dos palabras para Zero Constructor y campo

y costo total - 7 palabras. Por lo tanto, la cantidad de memoria para sus datos puede ser mayor que Int.

+0

No estoy seguro de lo que quiere decir con "palabras"? ¿Qué es una "palabra" y cómo calculo su uso de memoria? – Undreren

+4

Es una palabra de máquina, es un 4 bytes en máquinas de 32 bits y 8 bytes en 64 bits. –

+0

Creo que obtuve mi respuesta aquí, ya que alguien tuvo la amabilidad de marcar mi pregunta como un duplicado. – Undreren