winniethepooh 0 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба Здравствуйте. Подозреваю что вопрос совсем банальный, но все же задам. В тестовой программе bare metal при выделении памяти функция malloc для переменной типа uint32_t arm компилятор (использую keil) выделяет блоки кратные 8 (например 0x20000080; 0x20000088..). В случае использования yagarto- newlib (eclipse) выделяются блоки кратные 16(например 0х1fff0d30; 0х1fff0d40..) Почему yagarto выделяет блоки в двое большего размера под переменную такого же типа? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба Это особенности реализации конкретных аллокаторов. В keil аллокатор оптимизирован под небольшие объемы памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба В тестовой программе 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() на свой собственный аллокатор, который будет работать по любым вашим правилам (о том как это делается довольно много написано). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться