Приветствую читатель!Для тех кто со мной впервые вот оглавление:Часть 1Часть 2Часть 3Код лежит тутПодразумевается что читатель знаком с архитектурой аллокатора из части 3 и понимает алгоритм неявного списка свободных блоков который был освещен в части 1Аллокатор работает стабильно, все тесты зеленые, включая тесты на стабильность. И следующим шагом логично бы реализовать перегрузки new и delete для abi, но вот незадача: там есть версии принимающие дополнительный аргумент, а именно выравнивание. Эту фичу я реализовать как раз забыл. В архитектуре которая рассматривается в предыдущей статье это оказалось простой, но интересной задачей. Ее мы и обсудим ниже.Решение потребовало реализации функции mem_malloc_aligned которая выделит бОльший кусок памяти с учетом запрошенного выравнивания что бы мы там точно нашли правильно выровненный адрес.Но что если адрес указателя из mem_malloc_aligned не совпадает с адресом указателя который вернул mem_malloc? Что делать в mem_free? Что делать в mem_realloc? Как мне работать с указателем перед которым не хедера?Для начала я решил применить технику добавления смещения перед payload выровненного блока вместо хедера, смещения до payload изначального блока у которого есть хедер и футер.Но как мне отличить offset от header? Я решил добавить magic number в хедер и футер увеличив тем самым размер оверхеда в 2 раза и раз уж от него считалось внутреннее выравнивание блоков памяти в аллокаторе и минимальный размер блока, то теперь минимальный размер блока стал 32 байта, а с оверхедом все 64. Теперь можно просто проверять magic number и если он не совпадает, то интерпретировать число на месте хедера как смещение до payload блока который вернул mem_malloc и далее получив на него указатель работать с блоком стандартным образом. Читать далее
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | OSDEV: Разработка аллокатора на С++ часть 5. osdev-libstdc | 0 | 5 | 28-06-2026 |
| 2 | OSDEV: Разработка аллокатора на С++ часть 3. Финальный аллокатор со списками свободных блоков | 0 | 5 | 09-06-2026 |
| 3 | osdev-libstdc: реализация std::atomic и spin_lock | 0 | 5 | 28-06-2026 |
| 4 | Алиасинг памяти в C++: прошлое, настоящее, будущее | 0 | 7 | 10-06-2026 |
| 5 | [Перевод] Структуры данных на практике. Глава 17: Структуры данных загрузчиков | 0 | 5 | 29-06-2026 |
| 6 | OSDEV: Itanium часть 2: One-time Construction API и сигнлтоны Майерса | 0 | 5 | 08-07-2026 |
| 7 | OSDEV: vsnprintf полная реализация без поддержки чисел с плавающей точкой | 0 | 5 | 15-06-2026 |
| 8 | OSDEV: Itanium ABI часть 1: Array Operator new Cookies | 0 | 5 | 04-07-2026 |
| 9 | [Перевод] Структуры данных на практике. Глава 16: Фильтры Блума и вероятностные структуры данных | 0 | 8 | 28-06-2026 |
| 10 | С/С++ в современном машинном обучении: традиционные роли и возможности нового стандарта | 5 | 7 | 19-06-2026 |