Foreign.Marshal.Alloc

Foreign.Marshal.Alloc

원시(raw) 메모리 블록을 할당하고 해제하는 연산을 제공하는 모듈이에요.

출처: Haskell 2010 언어 리포트

본문

module Foreign.Marshal.Alloc (

    alloca,  allocaBytes,  malloc,  mallocBytes,  realloc,  reallocBytes,

    free,  finalizerFree

  ) where

Foreign.Marshal.Alloc 모듈은 원시 메모리 블록(즉, Haskell 저장 관리자가 유지하는 영역 바깥의 구조화되지 않은 메모리 조각)을 할당하고 해제하는 연산을 제공해요. 이 메모리 블록들은 일반적으로 복합 데이터 구조를 외국 함수에 전달하거나, 외국 함수로부터 복합 결과 값을 얻을 공간을 제공할 때 사용돼요.

만약 어떤 할당 함수가 실패하면 nullPtr 값이 생성돼요. freereallocBytesallocaallocaBytes로 할당된 메모리 영역에 적용하면 동작이 정의되지 않아요. allocaallocaBytes로 할당된 메모리 영역에 대해, 할당 함수에 전달된 계산이 종료된 뒤에 추가로 접근하면 동작이 정의되지 않아요. realloc, reallocBytes, 또는 free에 전달된 포인터가 참조하는 메모리 영역에 대한 추가 접근도 동작이 정의되지 않아요.

바이트 크기에 기반해 할당하는 함수들에 의해 할당된 모든 저장 공간은, 새로 할당된 저장 공간에 들어맞는 기본 외국 타입(basic foreign type)들 중 어떤 것에 대해서도 충분히 정렬(align)되어 있어야 해요. 특정 타입에 기반해 할당하는 함수들에 의해 할당된 모든 저장 공간은 그 타입에 대해 충분히 정렬되어 있어야 해요. 배열 할당 루틴도 각 배열 요소에 대해 같은 정렬 제약을 따라야 해요.

31.1 메모리 할당 (Memory allocation)

31.1.1 로컬 할당 (Local allocation)

alloca :: Storable a => (Ptr a -> IO b) -> IO b

alloca f는 타입 a의 값을 담기에 충분한 임시 할당 메모리 블록을 가리키는 포인터를 인자로 넘기며 계산 f를 실행해요.

f가 끝나면(정상 종료든 예외든) 메모리가 해제되므로, f에 전달된 포인터는 그 이후에 사용해서는 안 돼요.

allocaBytes :: Int -> (Ptr a -> IO b) -> IO b

allocaBytes n fn 바이트의 임시 할당 메모리 블록을 가리키는 포인터를 인자로 넘기며 계산 f를 실행해요. 그 메모리 블록은 할당된 크기의 메모리 블록에 들어맞는 기본 외국 타입들 중 어떤 것에 대해서도 충분히 정렬되어 있어요.

f가 끝나면(정상 종료든 예외든) 메모리가 해제되므로, f에 전달된 포인터는 그 이후에 사용해서는 안 돼요.

31.1.2 동적 할당 (Dynamic allocation)

malloc :: Storable a => IO (Ptr a)

타입 a의 값을 담기에 충분한 메모리 블록을 할당해요. 할당된 영역의 크기는 적절한 타입에 대한 Storable 인스턴스의 sizeOf 메서드에 의해 결정돼요.

더 이상 필요하지 않으면 freefinalizerFree를 사용해 메모리를 해제할 수 있어요.

mallocBytes :: Int -> IO (Ptr a)

주어진 바이트 수만큼의 메모리 블록을 할당해요. 그 메모리 블록은 할당된 크기의 메모리 블록에 들어맞는 기본 외국 타입들 중 어떤 것에 대해서도 충분히 정렬되어 있어요.

더 이상 필요하지 않으면 freefinalizerFree를 사용해 메모리를 해제할 수 있어요.

realloc :: Storable b => Ptr a -> IO (Ptr b)

malloc이나 mallocBytes로 할당된 메모리 영역을, 타입 b의 값을 저장하는 데 필요한 크기로 크기를 조정해요. 반환된 포인터는 완전히 다른 메모리 영역을 가리킬 수도 있지만, 타입 b의 값을 담기에 적절히 정렬되어 있을 거예요. 참조된 메모리 영역의 내용은 원래 크기와 타입 b 값의 크기 중 작은 쪽까지 원래 포인터의 내용과 같을 거예요.

realloc의 인자가 nullPtr이면 reallocmalloc처럼 동작해요.

reallocBytes :: Ptr a -> Int -> IO (Ptr a)

malloc이나 mallocBytes로 할당된 메모리 영역을 주어진 크기로 크기를 조정해요. 반환된 포인터는 완전히 다른 메모리 영역을 가리킬 수도 있지만, 주어진 크기의 메모리 블록에 들어맞는 기본 외국 타입들 중 어떤 것에 대해서도 충분히 정렬되어 있을 거예요. 참조된 메모리 영역의 내용은 원래 크기와 주어진 크기 중 작은 쪽까지 원래 포인터의 내용과 같을 거예요.

reallocBytes의 포인터 인자가 nullPtr이면 reallocBytesmalloc처럼 동작해요. 요청된 크기가 0이면 reallocBytesfree처럼 동작해요.

free :: Ptr a -> IO ()

malloc, mallocBytes, realloc, reallocBytes, Foreign.Marshal.Utils.new, 또는 Foreign.Marshal.Array·Foreign.C.Stringnew X 함수들 중 어떤 것으로 할당된 메모리 블록을 해제해요.

finalizerFree :: FinalizerPtr a

free와 동등한 외국 함수에 대한 포인터로, malloc, mallocBytes, realloc 또는 reallocBytes로 할당된 저장 공간에 대한 파이널라이저(참고: Foreign.ForeignPtr.ForeignPtr)로 사용될 수 있어요.

더 알아보기 (Learn more)