14.1. Выделение выровненной памяти: posix_memalign() и memalign()

14.1. Выделение выровненной памяти: posix_memalign() и memalign()

Для большинства задач отлично подходят стандартные процедуры выделения памяти — malloc(), realloc() и т.д. Но иногда может понадобиться память, которая выровнена тем или иным способом. Другими словами, адрес первого выделенного байта является кратным какого-нибудь числа. (Например, на некоторых системах копирование памяти осуществляется значительно быстрее, если используются буфера, выровненные по границе слова.) Такую службу предоставляют две функции:

#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);

 /* POSIX ADV */

void *memalign(size_t boundary, size_t size); /* Обычная */

posix_memalign() является более новой функцией; она является частью другого необязательного расширения, «Консультативной информации» («Advisory Information»). Работа функции отличается от других функций выделения памяти Linux. При наличии проблемы она не возвращает -1. Вместо этого возвращаемое значение равно 0 при успехе или значению errno в случае неудачи. Аргументы следующие:

void **memptr

Указатель на переменную void*. Указываемая переменная будет содержать адрес выделенного блока памяти. Выделенная память освобождается с помощью free().

size_t alignment

Требуемое выравнивание. Оно должно быть кратно sizeof(void*) и быть степенью двойки.

size_t size

Число выделяемых байтов.

memalign() является нестандартной, но широко доступной функцией, которая работает сходным образом. Возвращаемое значение равно NULL в случае неудачи и запрошенному блоку памяти при успехе, причем boundary (степень двойки) обозначает выравнивание, a size — затребованный размер памяти.

Традиционно выделенная memalign() память не могла быть освобождена с помощью free(), поскольку memalign() использовала для выделения памяти malloc() и возвращала указатель на выровненный подходящим образом байт где-то внутри блока. Версия GLIBC не имеет этой проблемы. Из этих двух функций следует использовать posix_memalign(), если она у вас есть.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

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

Из книги автора

3.2. Выделение памяти Четыре библиотечные функции образуют основу управления динамической памятью С Мы опишем сначала их, затем последуют описания двух системных вызовов, поверх которых построены эти библиотечные функции. Библиотечные функции С, в свою очередь, обычно


Статическое выделение памяти в стеке

Из книги автора

Статическое выделение памяти в стеке В пространстве пользователя многие операции выделения памяти, в частности некоторые рассмотренные ранее примеры, могут быть выполнены с использованием стека, потому что априори известен размер выделяемой области памяти. В


Выделение памяти, связанной с определенным процессором

Из книги автора

Выделение памяти, связанной с определенным процессором В современных операционных системах широко используются данные, связанные с определенными процессорами (per-CPU data). Это данные, которые являются уникальными для каждого процессора. Данные, связанные с процессорами,


Выделение дескриптора памяти

Из книги автора

Выделение дескриптора памяти Указатель на дескриптор памяти, выделенный для какой-либо задачи, хранится в поле mm дескриптора процесса этой задачи. Следовательно, выражение current->mm позволяет получить дескриптор памяти текущего процесса. Функция copy_mm() используется для


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

Из книги автора

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


18.6.5 Выделение оперативной памяти для VMware

Из книги автора

18.6.5 Выделение оперативной памяти для VMware Система VMware позволяет пользователям задавать как объем оперативной памяти, выделяемой каждому виртуальному компьютеру, так и общее количество ОП, зарезервированное для использования виртуальными машинами. Правильная настройка


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

Из книги автора

Выделение памяти      Сначала следует определить место для размещения строки при вводе. Как было отмечено раньше, это значит, выделить память, достаточную для размещения любых строк, которые мы предполагаем читать. Не следует надеяться, что компьютер подсчитает длину


5.1.3. Выделение сегментов памяти

Из книги автора

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


2.2. Динамическое выделение памяти и указатели

Из книги автора

2.2. Динамическое выделение памяти и указатели Прежде чем углубиться в объектно-ориентированную разработку, нам придется сделать небольшое отступление о работе с памятью в программе на С++. Мы не сможем написать сколько-нибудь сложную программу, не умея выделять память


Выделение

Из книги автора

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


Выделение ключа.

Из книги автора

Выделение ключа. После сохранения ключей друзей в вашем открытом кольце нам необходимо послать им свой открытый ключ. Прежде всего, его необходимо выделить из кольца:pgp -kx идентификатор файл [кольцо]Например: "pgp –kx angel mykey" выделяет открытый ключ, идентифицированный


Инструмент Выделение

Из книги автора

Инструмент Выделение Для выделения, перемещения в пространстве доски, изменения некоторых свойств объектов служит инструмент Выделение. Для выбора какого-либо объекта на странице необходимо сначала активизировать инструмент Выделение, в этом случае курсор приобретет


Выделение

Из книги автора

Выделение В главе 1, где говорится о Microsoft Windows, мы уже знакомились с понятием выделения. Однако это понятие настолько фундаментально, что мы возвращаемся к нему снова и будем возвращаться еще не раз. В этой главе мы обсудим два вида выделения: выделение текста и выделение