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)
#define memSetZero(buf, count)
#define memIsNullOrValid(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 размер буферов
Перекрестные ссылки memCmp().
Используется в memCmp().
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 размер буферов
Перекрестные ссылки memCmpRev().
Используется в memCmpRev().
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 размер буферов
Перекрестные ссылки memEq().
Используется в memEq().
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 значение
Перекрестные ссылки memIsRep().
Используется в memIsRep().
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 размер буфера
Перекрестные ссылки memIsZero().
Используется в memIsZero().
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 [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 из исходного текста.