Sponsor:

Your company here, and a link to your site. Click to find out more.

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)
Сравнение
int memCmpRev (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 FAST 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().

Аргументы

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

int FAST memCmpRev (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.

Прим.

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

Регулярность

Имеется ускоренная нерегулярная редакция.

Аргументы

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

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

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

Предусловие

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

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

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

Возвращает

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

Регулярность

Имеется ускоренная нерегулярная редакция.

Аргументы

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 FAST memIsRep (const void * buf, size_t count, octet o)

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

Прим.

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

Возвращает

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

Регулярность

Имеется ускоренная нерегулярная редакция.

Аргументы

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 FAST memIsZero (const void * buf, size_t count)

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

Возвращает

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

Регулярность

Имеется ускоренная нерегулярная редакция.

Аргументы

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. Незначащими считаются последние нулевые октеты буфера вплоть до первого ненулевого.

Возвращает

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

Регулярность

Функция нерегулярна: время выполнения зависит от заполнения 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 первый буфер  
buf2 второй буфер  
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 второе слагаемое / сумма  
src первое слагаемое  
count число октетов

Автор

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

Info

Вт 23 Янв 2024 00:00:00 Библиотека Bee2