реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Выделение памяти в Keil
glonium
сообщение Sep 6 2012, 06:19
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Доброго всем времени суток народ!
Столкнулся с интересным явлением описал шаблон класса типа
Код
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 байт!
В чём может быть дело?
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 6 2012, 06:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(glonium @ Sep 6 2012, 10:19) *
В чём может быть дело?

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

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

Откуда эта информация?
Go to the top of the page
 
+Quote Post
glonium
сообщение Sep 6 2012, 06:43
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Подряд выделяем память для нескольких объектов и адреса отличаются на 16 байт!
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 6 2012, 07:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

И это повод для волнения? Любой алгоритм выделения памяти должен где-то хранить служебную информацию. Очевидно, этот алгоритм хранит её между блоками выделенной памяти. Что вас удивляет?
Go to the top of the page
 
+Quote Post
glonium
сообщение Sep 6 2012, 08:08
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Конечно повод для волнения ведь для *char'ов например выделяет по 8 байт! и разница в адресах в подряд идущих *char равна 8 байтам!

Сообщение отредактировал glonium - Sep 6 2012, 08:12
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 6 2012, 08:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(glonium @ Sep 6 2012, 12:08) *
Конечно повод для волнения ведь для *char'ов например выделяет по 8 байт! и разница в адресах в подряд идущих *char равна 8 байтам!

Это субъективно. Меня, например, этот факт нисколько не волнует. Наоборот, мне кажется, что это вполне естественно. Накладные расходы при динамическом выделении памяти будут всегда.
Если вас не устраивает библиотечный менеджер памяти, можете сделать свой (или позаимствовать где-нибудь).
Go to the top of the page
 
+Quote Post
glonium
сообщение Sep 7 2012, 04:41
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Да всё верно посмотрел дамп памяти и увидел что в этом же выделенном блоке аллокатор помещает 4 байта служебной информации, следовательно если помещаемые данные меньше 4 байт то всё помещается в 8 байт, иначе будет выделено 16! Большое спасибо за помощь!
Go to the top of the page
 
+Quote Post
Intel4004
сообщение Sep 15 2012, 01:36
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Насколько я помню malloc выделяет память выровненную на 16.
Так что размер выделенного блока всегда будет кратен 16ти.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01415 секунд с 7
ELECTRONIX ©2004-2016