Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: выделение памяти malloc
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
winniethepooh
Здравствуйте.
Подозреваю что вопрос совсем банальный, но все же задам.
В тестовой программе bare metal при выделении памяти функция malloc для переменной типа uint32_t arm компилятор (использую keil) выделяет блоки кратные 8 (например 0x20000080; 0x20000088..).
В случае использования yagarto- newlib (eclipse) выделяются блоки кратные 16(например 0х1fff0d30; 0х1fff0d40..)
Почему yagarto выделяет блоки в двое большего размера под переменную такого же типа?
neiver
Это особенности реализации конкретных аллокаторов. В keil аллокатор оптимизирован под небольшие объемы памяти.
Olej
Цитата(winniethepooh @ Mar 3 2017, 10:44) *
В тестовой программе bare metal при выделении памяти функция malloc для переменной типа uint32_t arm компилятор (использую keil) выделяет блоки кратные 8 (например 0x20000080; 0x20000088..).
В случае использования yagarto- newlib (eclipse) выделяются блоки кратные 16(например 0х1fff0d30; 0х1fff0d40..)
Почему yagarto выделяет блоки в двое большего размера под переменную такого же типа?

Вопрос хороший, интересный...
1. Наблюдаемое вами различие связано не с "размером под переменную", а с выравниванием на границу выделяемых блоков. При выравнивании на 16 байт запросите 1 байт или 13 - и вы получите 16, запросите 17 - будет 32.
2. malloc() - функция стандартной библиотеки C, а никак не принадлежность компилятора (хотя, конечно, конкретная библиотека увязана с компилятором и идёт в комплекте с ним). Вы можете сменить стандартный malloc() на свой собственный аллокатор, который будет работать по любым вашим правилам (о том как это делается довольно много написано).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.