Управление памятью с помощью malloc и free
В настоящее время я изучаю, как память управляется malloc и свободна, и я не понимаю, почему, когда я хочу malloc 1 байт, malloc выделит 32 байта для блока? Для меня он должен выделить 16 байт для метаданных (размер предыдущего и следующего фрагментов) и 1 байт для данных...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/**
* pmem - print mem
* @p: memory address to start printing from
* @bytes: number of bytes to print
*
* Return: nothing
*/
void pmem(void *p, unsigned int bytes)
{
unsigned char *ptr;
unsigned int i;
ptr = (unsigned char *)p;
for (i = 0; i < bytes; i++)
{
if (i != 0)
{
printf(" ");
}
printf("%02x", *(ptr + i));
}
printf("\n");
}
/**
* main - moving the program break
*
* Return: EXIT_FAILURE if something failed. Otherwise EXIT_SUCCESS
*/
int main(void)
{
void *p;
size_t size_of_the_chunk;
char prev_used;
p = malloc(1);
printf("%p\n", p);
pmem((char *)p - 0x10, 0x10);
size_of_the_chunk = *((size_t *)((char *)p - 8));
prev_used = size_of_the_chunk & 1;
size_of_the_chunk -= prev_used;
printf("chunk size = %li bytes\n", size_of_the_chunk);
return (EXIT_SUCCESS);
}
Вот и результат. :
0x13bf010
00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00
размер блока = 32 байта



Ответы - Управление памятью с помощью malloc и free / Memory management by malloc and free

07.02.2020 04:25:49
Короче говоря, библиотека C memory management может свободно выделять столько памяти, сколько сочтет нужным. Может быть, для простоты он выделяет только кратные 32 байта. Тогда, очевидно, 32 байта-это минимум.
Другие распределители могут использовать другие стратегии.

07.02.2020 04:38:15
Я хочу, чтобы malloc 1 байт, malloc выделит 32 байта для куска ? Для меня он должен выделить 16 байт для метаданных (размер предыдущего блок и далее блока) и 1 байт для данных...
Тогда вам нужно написать свою собственную версию malloc
.
Стандарт не говорит, как это распределение должно выглядеть, если есть какие-либо дополнительные данные, или сколько памяти будет выделено.
Есть много обстоятельств, которые должны быть приняты во внимание, а не только "метаданные". Наверняка автор реализации имел что-то в середине, когда решал, как реализовать 'malloc'

07.02.2020 04:44:48
malloc
должен возвращать указатели, которые достаточно выровнены для хранения любого типа данных, даже типов данных, которые не могут поместиться в выделенное пространство. Это означает, что если _Alignof(max_align_t) == 32
в вашей системе, malloc(1)
должен возвращать только указатели, кратные 32, даже если вы просите меньше места, чем это. Простой способ для реализации сделать это-округлить каждое распределение до кратного 32 в своих внутренних бухгалтерских данных, которые, похоже, являются тем, что вы смотрите.
Тем не менее, стандарт C специально запрещает вам обращаться к памяти даже на один байт за пределами того объема пространства, который вы просили. Он также запрещает вам получать доступ malloc
или ASan, она выйдет из строя.


max_align_t
; это может отнять много места для программ, которые делают много небольших выделений. Но правило таково, каково оно есть, по крайней мере сейчас.



07.02.2020 05:58:11
Для меня он должен выделить 16 байт для метаданных (размер предыдущего и следующего фрагментов)
Нет, вы не можете утверждать что-то подобное. Он должен выделить хотя бы один байт, вот и все. Вы предполагаете, что данная стратегия распределения / реализации работает очень специфическим образом, но вы не можете в целом. Не существует стандарта, определяющего способ управления блоками свободной/выделенной памяти. Это может быть описано в документации используемой библиотеки распределения.
и 1 байт для данных
По крайней мере, еще раз. Большинство распределителей предпочитают выделять кучу байтов (обычно 32 или 64).