johnathan248 Ответов: 1

Для моей функции bulk allocator как я могу вернуть указатель на непрерывный блок памяти размером не менее байта, подобный malloc()


For my Bulk Allocator function how can I returns a pointer to a contiguous block of memory of at least size bytes, similar to malloc()


extra 8 bytes will be given to a header for our bulk allocated objects in the same fashion as pool allocated objects thus being freed easily

bulk_alloc() function returns a pointer to a contiguous block of memory similar to malloc().


Что я уже пробовал:

Я пробовал добавление 8 байт аргумента принимается основная функция распределителя. Затем, используя указатель по математике, чтобы пройти это и вернуться, что метаданные.

1 Ответов

Рейтинг:
12

Rick York

Вот один из способов, которым это можно сделать :

void * Allocator( size_t amount )
{
    size_t desired = amount + sizeof( AllocationHeader );
    size_t allocAmount = std::max( desired, MinimumAllocationAmount );
    unsigned char * p = (unsigned char *)GetSomeMemory( allocAmount );
    p += sizeof( AllocationHeader );
    return p;
}
Это просто арифметика указателей, как вы упомянули. Ключ состоит в том, чтобы привести его к указателю типа длиной в один байт. В противном случае арифметика будет искажена - добавление 1 не будет смещать указатель на один байт.

В этом примере AllocationHeader - это заголовок, который вы упомянули, MinimumAllocationAmount-это некоторая минимальная сумма, если вы хотите избежать выделения 1 или 2 байтов за раз, а GetSomeMemory-это все, что вы хотите использовать для получения памяти-calloc, new, custom и т. д...

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