Spec-Zone.ru › Haskell 8

Foreign.Marshal.Alloc

Авторские права (c) Группа по разработке FFI 2001
Лицензия Лицензия BSD (см. файл libraries/base/LICENSE)
Автор ffi@haskell.org
Стабильность предварительная
Переносимость переносимая
Безопасный Haskell Надёжный
Язык Haskell2010

Содержание

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

Описание

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

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

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

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

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

alloca :: forall a b. 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 :: forall a. Storable a => IO (Ptr a) Исходный код

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

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

mallocBytes :: Int -> IO (Ptr a) Исходный код

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

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

calloc :: forall a. Storable a => IO (Ptr a) Исходный код

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

callocBytes :: Int -> IO (Ptr a) Исходный код

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

realloc :: forall a b. 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/8.10.2/docs/html/libraries/base-4.14.1.0/Foreign-Marshal-Alloc.html

Spec-Zone.ru

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