2016-08-17 1 views
4

데이터 형식이 개의 생성자로 이루어져 있다고 가정 해 보겠습니다.큰 대수 데이터 형식의 메모리 발자국

data ManyValues 
    = Value0 
    | Value1 
    | Value2 
    ... 
    | Value255 
    | Value256 
    deriving (Show,Eq) 

이 데이터 유형 중 하나의 값에 대한 메모리 사용량은 얼마입니까? 내 원래의 이해는 각 생성자가 메모리의 8 비트 단어이지만 데이터 형식에 8 비트의 가능한 값보다 많은 생성자가있는 경우 어떻게됩니까? 생성자는 데이터 유형에 존재하는 생성자의 전체 범위를 처리 할 수있을 때까지 최대 16 비트까지 증가합니까? 아니면이 모든 것이 섞여 있습니까?

+0

도움이 될 수 있습니다. https://stackoverflow.com/questions/3254758/memory-footprint-of-haskell-data-types – Sibi

+0

감사합니다. 게시하기 전에 보았습니다. 제로 필드 생성자에 대해서는 객체 공유에 대한 흥미로운 점이 있지만 8 비트로 처리 할 수있는 것보다 많은 생성자 (심지어 제로 필드 생성자)가있을 때 어떤 일이 발생하는지는 다루지 않습니다. 이것은 8 비트 헤더가 사용되는 것으로 가정합니다. – carpemb

+6

아,하지만 그 대답에서 헤더 "단어"는 분명히 적어도 32 비트입니다. 물론 문제는 여전히 원칙적입니다 (예 : 한 가지 방법은 처음 32 비트를 사용하여 선택 항목을 좁히는 것일 수 있습니다).하지만 데이터 유형에 2^32 개의 생성자가 있으면 다른 엔지니어링 문제가 발생할 수 있습니다. – pigworker

답변

3

내가 알고 있듯이 무효 생성자는 1 개의 기계어 단어 (즉, 정적으로 할당 된 데이터에 대한 포인터)를 사용합니다. 그래서 당신의 데이터 구조가 그러한 생성자를 갖든 1,000,000이든, 여전히 1 기계어입니다.

필드가있는 생성자는 더 많은 공간을 차지하지만 GHC는 해당 값의 모든 인스턴스간에 단일 정적 싱글 톤을 공유하기 위해 GHC 특수한 경우 nullary 생성자를 사용합니다. (예는 오직 하나 True 전체 프로그램에있다.) 물론

, 썽크가 이미 기존 값 (어떤 값), GHC는 "리디렉션"노드로 썽크를 덮어을 평가할 때, 어떤 공간을 차지합니다. 주기적으로 가비지 컬렉터는 리디렉션을 제거합니다.

+0

그것은 많은 의미가 있습니다. 그래서 나는이 질문에 대답했습니다. "1 기계어"가 실제로 의미하는 바에 대한 핵심 혼란이 드러났습니다. 그러나 나는 그 문제에 관해 지금 스스로 교육했다. 그러나 이것은 메모리 단편화에 대한 추가 질문을 열었습니다. – carpemb

+0

nullary 생성자가 공유 객체에 대한 포인터 일 경우, 실제 호출 사이트의 메모리에있는 객체를 참조 할 수 있습니다 (GC가 가까이 갈 때까지). 그리고 그러한 경우에는 낮은 수준의 데이터를 상자가없는 선형 데이터 구조에서 스마트하게 구성된 'Word32'또는 'Word64'값으로 표시하여 더 낮은 할당 및 더 나은 메모리 지역에 대한 공간 효율성을 포기하는 것이 더 효율적입니까? – carpemb

+1

왜 "기억이 아주 멀리 떨어져있는"것이 문제가됩니까? 그것은 메모리 지역이 작동하는 방식이 아닙니다. 프로그램의 모든 nullary 생성자는 절대 이동하지 않는 단일 연속 메모리 블록에 있습니다. 꽤 캐시 친화적이어야합니다. – MathematicalOrchid

관련 문제