Spec-Zone.ru › Haskell 7

Foreign.Marshal.Alloc

Copyright (c) The FFI task force 2001
License BSD-style (see the file libraries/base/LICENSE)
Maintainer ffi@haskell.org
Stability provisional
Portability portable
Safe Haskell Trustworthy
Language Haskell2010

Содержание

  • Выделение памяти
    • Локальное выделение
    • Динамическое выделение

Описание

Модуль Foreign.Marshal.Alloc предоставляет операции для выделения и освобождения блоков сырой памяти (т.е., неструктурированных кусков памяти за пределами области, управляемой менеджером памяти Haskell). Эти блоки памяти обычно используются для передачи сложных структур данных внешним функциям или для предоставления места, в котором сложные значения результатов получаются из внешних функций.

Если какая-либо из функций выделения завершается ошибкой, выбрасывается исключение. В некоторых случаях недостаток памяти может привести к завершению процесса. Если free или reallocBytes применяются к области памяти, выделенной с помощью alloca или allocaBytes, поведение не определено. Любой дальнейший доступ к областям памяти, выделенным с помощью alloca или allocaBytes, после завершения вычисления, переданного функции выделения, приводит к неопределенному поведению. Любой дальнейший доступ к области памяти, на которую ссылается указатель, переданный в realloc, reallocBytes, или free, влечёт неопределённое поведение.

Вся память, выделенная функциями, которые выделяют память на основе размера в байтах, должна быть достаточно выровнена для любого из основных типов внешних типов, которые помещаются в нововыделенную память. Вся память, выделенная функциями, которые выделяют память на основе конкретного типа, должна быть достаточно выровнена для этого типа. Процедуры выделения массивов должны соблюдать те же ограничения на выравнивание для каждого элемента массива.

Выделение памяти

Локальное выделение

alloca :: Storable a => (Ptr a -> IO b) -> IO b Источник

alloca f выполняет вычисление f, передавая в качестве аргумента указатель на временный блок памяти, достаточный для хранения значений типа a.

Память освобождается, когда f завершается (как нормально, так и с помощью исключения), поэтому указатель, переданный f использовать не следует после этого.

allocaBytes :: Int -> (Ptr a -> IO b) -> IO b Источник

allocaBytes n f выполняет вычисление f, передавая в качестве аргумента указатель на временный блок памяти размером n байт. Блок памяти достаточно выровнен для любого из основных внешних типов, которые помещаются в блок памяти заданного размера.

Память освобождается, когда f завершается (как нормально, так и с помощью исключения), поэтому указатель, переданный f использовать не следует после этого.

allocaBytesAligned :: Int -> Int -> (Ptr a -> IO b) -> IO b Источник

Динамическое выделение

malloc :: Storable a => IO (Ptr a) Источник

Выделяет блок памяти, достаточный для хранения значений типа a. Размер выделенной области определяется методом sizeOf из экземпляра Storable для соответствующего типа.

Память можно освободить с помощью free или finalizerFree, когда она больше не требуется.

mallocBytes :: Int -> IO (Ptr a) Источник

Выделяет блок памяти заданного размера в байтах. Блок памяти достаточно выровнен для любого из основных внешних типов, которые помещаются в блок памяти заданного размера.

Память можно освободить с помощью free или finalizerFree когда она больше не требуется.

calloc :: Storable a => IO (Ptr a) Источник

Подобно malloc, но память заполняется байтами со значением ноль.

callocBytes :: Int -> IO (Ptr a) Источник

Подобно mallocBytes, но память заполняется байтами со значением ноль.

realloc :: Storable b => Ptr a -> IO (Ptr b) Источник

Изменяет размер области памяти, выделенной с помощью malloc или mallocBytes, до размера, необходимого для хранения значений типа b. Возвращаемый указатель может ссылаться на совершенно другую область памяти, но будет правильно выровнен для хранения значений типа b. Содержимое области памяти по ссылке будет таким же, как у исходного указателя, вплоть до минимального из исходного размера и размера значений типа b.

Если аргумент функции realloc равен nullPtr, функция realloc ведёт себя как malloc.

reallocBytes :: Ptr a -> Int -> IO (Ptr a) Источник

Изменяет размер области памяти, выделенной с помощью malloc или mallocBytes, на заданный размер. Возвращаемый указатель может ссылаться на совершенно другую область памяти, но будет достаточно выровнен для любого из основных внешних типов, которые помещаются в блок памяти заданного размера. Содержимое области памяти по ссылке будет таким же, как у исходного указателя, вплоть до минимального из исходного размера и заданного размера.

Если указатель-аргумент функции reallocBytes равен nullPtr, функция reallocBytes ведёт себя как malloc. Если запрашиваемый размер равен 0, функция reallocBytes ведёт себя как free.

free :: Ptr a -> IO () Источник

Освобождает блок памяти, выделенный с помощью malloc, mallocBytes, realloc, reallocBytes, new или любой из функций newX в Foreign.Marshal.Array или Foreign.C.String.

finalizerFree :: FinalizerPtr a Источник

Указатель на внешнюю функцию, эквивалентную free, которая может использоваться в качестве завершающей функции (см. ForeignPtr) для памяти, выделенной с помощью malloc, mallocBytes, realloc или reallocBytes.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Foreign-Marshal-Alloc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API