История изменений
Исправление KivApple, (текущая версия) :
malloc округляет выделение памяти, конечно же. И так было даже во времена DOS. 1 байт ни один менеджер памяти тебе не даст, а под капотом выделит чуть больше.
Но!
Допустим, размер указателя 32 бита. Мой malloc при запросе 1-4 байт реально выделит 8 байт (4 байта размер блока + 1-4 байта полезных данных + 0-3 байта округление). Если связанный список свободных блоков однонаправленный, то 8 байт вполне хватит для хранения свободного элемента в списке при освобождении (размер не трогаем, перезаписываем «1-4 байта полезных данных» указателем на следующий блок).
А если перед занятым блоком держать место для полной структуры свободного, то выделение 1-4 байт приведёт к реальному выделению 12 байт (8 байт заголовок + 1-4 байт полезных данных, размер полезных данных округляется до 4 байт из-за выравнивания на 32-битной системе).
Итого, на маленьких аллокациях мой malloc ощутимо экономит память.
Исправление KivApple, :
malloc округляет выделение памяти, конечно же. И так было даже во времена DOS. 1 байт ни один менеджер памяти тебе не даст, а под капотом выделит чуть больше.
Но!
Допустим, размер указателя 32 бита. Мой malloc при запросе 1-4 байт реально выделит 8 байт (4 байта размер блока + 1-4 байта полезных данных). Если связанный список свободных блоков однонаправленный, то 8 байт вполне хватит для хранения свободного элемента в списке при освобождении (размер не трогаем, перезаписываем «1-4 байта полезных данных» указателем на следующий блок).
А если перед занятым блоком держать место для полной структуры свободного, то выделение 1-4 байт приведёт к реальному выделению 12 байт (8 байт заголовок + 1-4 байт полезных данных, размер полезных данных округляется до 4 байт из-за выравнивания на 32-битной системе).
Итого, на маленьких аллокациях мой malloc ощутимо экономит память.
Исправление KivApple, :
malloc округляет выделение памяти, конечно же. И так было даже во времена DOS. 1 байт ни один менеджер памяти тебе не даст, а под капотом выделит чуть больше.
Но!
Допустим, размер указателя 32 бита. Мой malloc при запросе 1-4 байт реально выделит 8 байт (4 байта размер блока + 1-4 байта полезных данных). Если связанный список свободных блоков однонаправленный, то 8 байт вполне хватит для хранения свободного элемента в списке при освобождении (размер не трогаем, перезаписываем «1-4 байта полезных данных» указателем на следующий блок).
А если перед занятым блоком держать место для полной структуры свободного, то выделение 1-4 байт приведёт к реальному выделению 12 байт (8 байт заголовок + 1-4 байт полезных данных, размер полезных данных округляется до 4 байт из-за выравнивания на 32-битной системе).
Исходная версия KivApple, :
malloc округляет выделение памяти, конечно же. И так было даже во времена DOS. 1 байт ни один менеджер памяти тебе не даст, а под капотом выделит чуть больше.
Но!
Допустим, размер указателя 32 бита. Мой malloc при запросе 1-4 байт реально выделит 8 байт (4 байта размер блока + 1-4 байта полезных данных). Если связанный список свободных блоков однонаправленный, то 8 байт вполне хватит для хранения свободного элемента в списке при освобождении.
А если перед занятым блоком держать место для полной структуры свободного, то выделение 1-4 байт приведёт к реальному выделению 12 байт (8 байт заголовок + 1-4 байт полезных данных, размер полезных данных округляется до 4 байт из-за выравнивания на 32-битной системе).