#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*) для выравнивания