mem.h - Man Page

Управление памятью

Synopsis

#include <memory.h>
#include <string.h>
#include 'bee2/defs.h'
#include 'bee2/core/safe.h'

Макросы

#define memCopyIf(dest,  src,  count)   ((dest) && (src) ? memCopy(dest, src, count) : 0)
#define memSetZero(buf,  count)   memSet(buf, 0, count)
#define memIsNullOrValid(buf,  count)   ((buf) == 0 || memIsValid(buf, count))
Нулевой указатель или корректный буфер памяти?

Функции

void memCopy (void *dest, const void *src, size_t count)
Копировать буфер памяти
void memMove (void *dest, const void *src, size_t count)
Переместить буфер памяти
void memSet (void *buf, octet c, size_t count)
Заполнить буфер памяти
void memNeg (void *buf, size_t count)
Инвертировать буфер памяти
void * memAlloc (size_t count)
Выделение блока памяти Выделяется блок динамической памяти из count октетов.
void * memRealloc (void *buf, size_t count)
Изменение размера блока памяти Размер блока динамической памяти buf устанавливается равным count. При необходимости блок перемещается в памяти. Содержимое блока максимально сохраняется.
void memFree (void *buf)
Освобождение блока памяти
bool_t memIsValid (const void *buf, size_t count)
Корректный буфер памяти?
bool_t memIsAligned (const void *buf, size_t size)
Буфер выровнен на границу?
bool_t memEq (const void *buf1, const void *buf2, size_t count)
Проверка совпадения
int memCmp (const void *buf1, const void *buf2, size_t count)
Сравнение
void memWipe (void *buf, size_t count)
Очистить буфер памяти
bool_t memIsZero (const void *buf, size_t count)
Нулевой буфер памяти?
size_t memNonZeroSize (const void *buf, size_t count)
Размер значащей части буфера
bool_t memIsRep (const void *buf, size_t count, octet o)
Повтор октета?
void memJoin (void *dest, const void *src1, size_t count1, const void *src2, size_t count2)
Объединение двух буферов
bool_t memIsDisjoint (const void *buf1, const void *buf2, size_t count)
Буферы одинакового размера не пересекаются?
bool_t memIsSameOrDisjoint (const void *buf1, const void *buf2, size_t count)
Буферы совпадают или не пересекаются?
bool_t memIsDisjoint2 (const void *buf1, size_t count1, const void *buf2, size_t count2)
Два буфера не пересекаются?
bool_t memIsDisjoint3 (const void *buf1, size_t count1, const void *buf2, size_t count2, const void *buf3, size_t count3)
Три буфера не пересекаются?
bool_t memIsDisjoint4 (const void *buf1, size_t count1, const void *buf2, size_t count2, const void *buf3, size_t count3, const void *buf4, size_t count4)
Четыре буфера не пересекаются?
void memXor (void *dest, const void *src1, const void *src2, size_t count)
Cложение октетов памяти по модулю 2.
void memXor2 (void *dest, const void *src, size_t count)
Добавление октетов памяти по модулю 2.
void memSwap (void *buf1, void *buf2, size_t count)
Перестановка октетов памяти
void memRev (void *buf, size_t count)
Реверс октетов

Подробное описание

Реализованы или переопределены манипуляции над буферами памяти, которые интерпретируются как строки октетов.

Функции xxTo и xxFrom выполняют преобразования между буферами памяти и другими структурами данных. Могут быть функции двух типов: простые и сложные. В простых функциях объем памяти для размещения преобразованных данных сразу известен. В простые функции передается корректный указатель на буфер-назначение, простые функции не возвращают никаких значений. В сложных функциях объем выходных данных рассчитывается по входным и возвращается как выходное значение. В сложную функцию можно передать нулевой указатель на буфер-назначение, получить требуемый объем буфера, зарезервировать буфер и обратиться к функции еще один раз.

Буфер памяти может представлять массив слов u16, u32, u64, word. Стандартными считаются соглашения LITTLE_ENDIAN (см. defs.h). Поэтому на платформах с соглашениями BIG_ENDIAN при загрузке слова из памяти и, наоборот, при сохранении слова в памяти выполняется реверс октетов слова.

Предусловие

В функции передаются корректные буферы памяти.

Макросы

#define memCopyIf(dest, src, count)   ((dest) && (src) ? memCopy(dest, src, count) : 0)

Копировать [count]src в [count]dest, если указатели src и dest ненулевые.

#define memSetZero(buf, count)   memSet(buf, 0, count)

Буфер [count]buf обнуляется.

Функции

void * memAlloc (size_t count)

Возвращает

Указатель на блок памяти или 0, если памяти не хватает.

Прим.

Блок выделяется, даже если count == 0.

Аргументы

count размер блока

int memCmp (const void * buf1, const void * buf2, size_t count)

Буферы [count]buf1 и [count]buf2 сравниваются обратно-лексикографически.

Возвращает

< 0, если [count]buf1 < [count]buf2, 0, если [count]buf1 == [count]buf2,

0, если [count]buf1 > [count]buf2.

Прим.

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

Предупреждения

Стандартная функция memcmp() сравнивает октеты от первого к последнему.

Регулярность:\n Имеется ускоренная нерегулярная редакция.

Аргументы

buf1 первый буфер
buf2 второй буфер
count размер буферов

void memCopy (void * dest, const void * src, size_t count)

Октеты буфера [count]src переписываются в буфер [count]dest.

Предусловие

Буферы src и dest не пересекаются.

bool_t memEq (const void * buf1, const void * buf2, size_t count)

Проверяется, что содержимое буферов [count]buf1 и [count]buf2 совпадает.

Возвращает

Признак совпадения.

Регулярность:\n Имеется ускоренная нерегулярная редакция.

Аргументы

buf1 первый буфер
buf2 второй буфер
count размер буферов

void memFree (void * buf)

Освобождается блок динамической памяти buf.

Предусловие

buf выделен с помощью memAlloc() или memRealloc().

Аргументы

buf буфер

bool_t memIsAligned (const void * buf, size_t size)

Проверяется, что buf выровнен на границу size-байтового блока.

Возвращает

Проверяемый признак.

Аргументы

buf буфер
size длина блока

bool_t memIsDisjoint (const void * buf1, const void * buf2, size_t count)

Проверяется, что буфер [count]buf1 не пересекается с буфером [count]buf2.

Возвращает

Проверяемый признак.

Предусловие

Буферы buf1 и buf2 корректны.

Аргументы

buf1 первый буфер
buf2 второй буфер
count размер буферов

bool_t memIsDisjoint2 (const void * buf1, size_t count1, const void * buf2, size_t count2)

Проверяется, что буфер [count1]buf1 не пересекается с буфером [count2]buf2.

Возвращает

Проверяемый признак.

Предусловие

Буферы buf1 и buf2 корректны.

Аргументы

buf1 первый буфер
count1 размер buf1
buf2 второй буфер
count2 размер buf2

bool_t memIsDisjoint3 (const void * buf1, size_t count1, const void * buf2, size_t count2, const void * buf3, size_t count3)

Проверяется, что буферы [count1]buf1, [count2]buf2 и [count3]buf3 попарно не пересекаются.

Возвращает

Проверяемый признак.

Предусловие

Буферы buf1, buf2 и buf3 корректны.

Аргументы

buf1 первый буфер
count1 размер buf1
buf2 второй буфер
count2 размер buf2
buf3 третий буфер
count3 размер buf3

bool_t memIsDisjoint4 (const void * buf1, size_t count1, const void * buf2, size_t count2, const void * buf3, size_t count3, const void * buf4, size_t count4)

Проверяется, что буферы [count1]buf1, [count2]buf2, [count3]buf3 и [count4]buf4 попарно не пересекаются.

Возвращает

Проверяемый признак.

Предусловие

Буферы buf1, buf2, buf3 и buf4 корректны.

Аргументы

buf1 первый буфер
count1 размер buf1
buf2 второй буфер
count2 размер buf2
buf3 третий буфер
count3 размер buf3
buf4 четвертый буфер
count4 размер buf4

bool_t memIsRep (const void * buf, size_t count, octet o)

Проверяется, что [count]buf заполнен октетом o.

Прим.

Считается, что в пустом буфере (count == 0) повторяется значение 0.

Возвращает

Признак успеха.

Регулярность:\n Имеется ускоренная нерегулярная редакция.

Аргументы

buf буфер
count размер буфера
o значение

bool_t memIsSameOrDisjoint (const void * buf1, const void * buf2, size_t count)

Проверяется, что буфер [count]buf1 совпадает или не пересекается с буфером [count]buf2.

Возвращает

Проверяемый признак.

Предусловие

Буферы buf1 и buf2 корректны.

Аргументы

buf1 первый буфер
buf2 второй буфер
count размер буферов

bool_t memIsValid (const void * buf, size_t count)

Проверяется, что [count]buf является корректным буфером.

Возвращает

Проверяемый признак.

Прим.

Нулевой указатель buf является корректным, если count == 0.

Аргументы

buf буфер
count размер буфера

bool_t memIsZero (const void * buf, size_t count)

Проверяется, что буфер [count]buf является нулевым.

Возвращает

Проверяемый признак.

Регулярность:\n Имеется ускоренная нерегулярная редакция.

Аргументы

buf буфер
count размер буфера

void memJoin (void * dest, const void * src1, size_t count1, const void * src2, size_t count2)

В dest записывается блок [count1]src1 || [count2]src2.

Предусловие

По адресам src1, src2, dest зарезервировано count1, count2 и count1 + count2 октетов памяти соответственно.

Прим.

Буферы src1, src2 и dest могут пересекаться.

Аргументы

dest назначение
src1 первый источник
count1 число октетов src1
src2 второй источник
count2 число октетов src2

void memMove (void * dest, const void * src, size_t count)

Октеты буфера [count]src перемещаются в буфер [count]dest.

Предусловие

Буферы src и dest могут пересекаться.

void memNeg (void * buf, size_t count)

Все биты буфера [count]buf инвертируются.

size_t memNonZeroSize (const void * buf, size_t count)

Определяется размер значащей части буфера [count]buf. Незначащими считаются последние нулевые октеты буфера вплоть до первого ненулевого.

Возвращает

Размер значащей части в октетах.

Регулярность:\n Функция нерегулярна: время выполнения зависит от заполнения buf.

Аргументы

buf буфер
count размер буфера

void * memRealloc (void * buf, size_t count)

Возвращает

Указатель на блок памяти с новым размером или 0, если count == 0 или памяти не хватает.

Прим.

memRealloc(buf, 0) равносильно memFree(buf).

Аргументы

buf блок памяти
count размер блока

void memRev (void * buf, size_t count)

Октеты буфера [count]buf записываются в обратном порядке.

Аргументы

buf буфер
count размер буфера

void memSet (void * buf, octet c, size_t count)

Буфер [count]buf заполняется октетом c.

void memSwap (void * buf1, void * buf2, size_t count)

Октеты буферов [count]buf1 и [count]buf2 меняются местами.

Предусловие

Буферы buf1 и buf2 не пересекаются.

Аргументы

buf1 [in/out] первый буфер
buf2 [in/out] второй буфер
count число октетов

void memWipe (void * buf, size_t count)

Буфер [count]buf очищается -- в него записываются произвольные октеты.

Прим.

Запись выполняется всегда, даже если buf в дальнейшем не используется и включена оптимизация компиляции.

Аргументы

buf буфер
count размер буфера

void memXor (void * dest, const void * src1, const void * src2, size_t count)

В буфер [count]dest записывается поразрядная по модулю 2 сумма октетов октетов буферов [count]src1 и [count]src2.

Предусловие

Буфер dest либо не пересекается, либо совпадает с каждым из буферов src1, src2.

Аргументы

dest сумма
src1 первое слагаемое
src2 второе слагаемое
count число октетов

void memXor2 (void * dest, const void * src, size_t count)

К октетам буфера [count]dest добавляются октеты буфера [count]src. Сложение выполняется поразрядно по модулю 2.

Предусловие

Буфер dest либо не пересекается, либо совпадает с буфером src.

Аргументы

dest [in/out] второе слагаемое / сумма
src первое слагаемое
count число октетов

Автор

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.

Info

Пн 13 Фев 2023 Библиотека Bee2