Пользовательский распределитель памяти в c

#c #memory-management #operating-system #heap-memory

#c #управление памятью #операционная система #куча-память

Вопрос:

Я нашел эту ссылку, которая описывает, как работает пользовательский распределитель памяти:

https://github.com/lovelaced/muhalloc/blob/master/mem.c

Почему Mem_Alloc() делится на 4 и увеличивается size , чтобы быть кратным 4?

Вот описание функции по этой ссылке:

 /* Function for allocating 'size' bytes. */
/* Returns address of allocated block on success */
/* Returns NULL on failure */
/* Here is what this function should accomplish */
/* - Check for sanity of size - Return NULL when appropriate */
/* - Round up size to a multiple of 4 */
/* - Traverse the list of blocks and allocate the best free block which can accommodate the requested size */
/* -- Also, when allocating a block - split it into two blocks when possible */
/* Tips: Be careful with pointer arithmetic */
void* Mem_Alloc(int size)
    ...
  

Ответ №1:

Это для выравнивания; и это довольно плохой пример того, как это сделать. Если вы посмотрите на пример из K amp; R’s the C Programming Language, он представляет исходный код для распределителя, который является переносимым, эффективным и простым для понимания. C — тонкий язык, лучше всего сначала изучить его, прочитав хорошие программы.

Ответ №2:

выравнивание данных для повышения эффективности доступа к памяти

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

Комментарии:

1. Есть ли способ в c узнать, на сколько байт ссылается адрес памяти? Или адрес памяти по умолчанию относится к 4 байтам

2. Рекомендуется использовать размер sizeof (void*) для выравнивания