LINUX.ORG.RU

История изменений

Исправление 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-битной системе).