Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выделение памяти в Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
glonium
Доброго всем времени суток народ!
Столкнулся с интересным явлением описал шаблон класса типа
Код
template<class TData>
class TSingleListItem
{
    friend class TSingleList<TData>;
    private :
        TSingleListItem<TData> *_next;
        TData _data;
        TSingleListItem(TData d,TSingleListItem<TData> *n);
        ~TSingleListItem();
    // Запрет копирования
        TSingleListItem(TSingleListItem<TData> &i);
        TSingleListItem<TData> & operator = (TSingleListItem<TData> &i);
    public :
        TData operator * ();
        TSingleListItem<TData> *Next(void );
};


строка
Код
s=sizeof(TSingleListItem<char>);

говорит что размер TSingleListItem<char> 8 байт,
но при выделении памяти для TSingleListItem<char> память выделяется по 16 байт! хотя размер минимального блока составляет 8 байт!
В чём может быть дело?
scifi
Цитата(glonium @ Sep 6 2012, 10:19) *
В чём может быть дело?

Просто из общих соображений: механизм выделения памяти может иметь накладные расходы (указатели связанных списков и т.п.)

Цитата(glonium @ Sep 6 2012, 10:19) *
но при выделении памяти для TSingleListItem<char> память выделяется по 16 байт!

Откуда эта информация?
glonium
Подряд выделяем память для нескольких объектов и адреса отличаются на 16 байт!
scifi
Цитата(glonium @ Sep 6 2012, 10:43) *
Подряд выделяем память для нескольких объектов и адреса отличаются на 16 байт!

И это повод для волнения? Любой алгоритм выделения памяти должен где-то хранить служебную информацию. Очевидно, этот алгоритм хранит её между блоками выделенной памяти. Что вас удивляет?
glonium
Конечно повод для волнения ведь для *char'ов например выделяет по 8 байт! и разница в адресах в подряд идущих *char равна 8 байтам!
scifi
Цитата(glonium @ Sep 6 2012, 12:08) *
Конечно повод для волнения ведь для *char'ов например выделяет по 8 байт! и разница в адресах в подряд идущих *char равна 8 байтам!

Это субъективно. Меня, например, этот факт нисколько не волнует. Наоборот, мне кажется, что это вполне естественно. Накладные расходы при динамическом выделении памяти будут всегда.
Если вас не устраивает библиотечный менеджер памяти, можете сделать свой (или позаимствовать где-нибудь).
glonium
Да всё верно посмотрел дамп памяти и увидел что в этом же выделенном блоке аллокатор помещает 4 байта служебной информации, следовательно если помещаемые данные меньше 4 байт то всё помещается в 8 байт, иначе будет выделено 16! Большое спасибо за помощь!
Intel4004
Насколько я помню malloc выделяет память выровненную на 16.
Так что размер выделенного блока всегда будет кратен 16ти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.