Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Extended Embedded C++ и кол-во объектов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Colobox
Вот такая простенькая программа:
Код
................
TByte*bb0,*bb1,*bb2;
.................
//---------------------------
int main()
{
    bb0=new TByte(1);
    bb1=new TByte(2);
    bb2=new TByte(3);
}
//-----------------------------

TByte - некий тип объектов с параметром.
При прогоне JTAG выдает: "The application aborted."
В случае:
Код
//---------------------------
int main()
{
    bb0=new TByte(1);
    bb1=new TByte(2);
}
//-----------------------------

все нормально, прога прокатывает без особенностей.
Неужели количество динамически создаваемых объектов проблемно или
ограниченно?! Или просто глюк? crying.gif
Надеюсь, просто чо-то не понимаю.
P.S. IAR for AVR 4.20
sergeeff
А к моменту вызова main() heap инициализирована?
Colobox
Опс! А как это, простите, делать надо? unsure.gif
sergeeff
Ну дожен быть в библиотеке некий набор функций, обеспечивающий возможность динамического размещения неких объектов в памяти. До вызова main обычно работает startup модуль, в котором должна инициироваться "куча". Вопрос еще в том где физически она размещается, и каков ее размер.
Colobox
Хм, а какие, например, вообще функции это делают?!
Разве куча не инициализируется автоматически? А физически куча в RAM, конечно.То, что осталось от стеков и глобальных и статических переменных- это и есть куча. Чего то недопонимаю?
Проц: Атмега128.
Aaaa, все!!! разобрался... В настройках проекта NEAR_HEAP увеличил в 2 раза 0x20->0x40
От напАсть-то!!! a14.gif
sergeeff
Можно и так сделать. Но кто-то должен кучу инициировать с указанием начального адреса и объема. Интересно, а как ты себе представляешь "инициализируется автоматически"? Скорее всего в startup'e вызывается фукция инициализации кучи (а может и не вызывается, не всем же нужна куча!). Так вот и возникают два вопроса:
1. Вызывается ли функция инициализации?
2. С какими параметрами?

Может куча и создается, но размером в 8-16 или кто его знает байт. Вот туда что-то помещается, а больше - нет.

Вообще полезно при написании программ с этим делом сразу разобраться, чтобы в будущем понимать что к чему. Да. кстати интересно, а что кажет sizeof(TByte)?
Colobox
Цитата
Интересно, а как ты себе представляешь "инициализируется автоматически"?

Компилятор генерит стартап, который и рулит начальными параметрами кучи-это я и назвал: "автоматически"-отдельно ручками ничего делать не надо.
Цитата
(а может и не вызывается, не всем же нужна куча!).

Судя по-наличию в настройках параметра near_heap со значением по-умолчанию (0x20)- скорее всего,
куча по-любому как-то обрабатывается- она ж просто остаток от памяти, чего ей не быть?!
Цитата
2. С какими параметрами?

вот с этим как-раз near_heap, но что означает 0х20 -не въезжал пока...
Цитата
Может куча и создается, но размером в 8-16 или кто его знает байт. Вот туда что-то помещается, а больше - нет.

Это очевидно, сейчас, по-меньшей мере.
Цитата
Вообще полезно при написании программ с этим делом сразу разобраться, чтобы в будущем понимать что к чему. Да. кстати интересно, а что кажет sizeof(TByte)?

Полезно, думаю еще столкнусь: в проге много динамических объектов будет.
Пользую new, нууу объект типа TByte небольшой вообще.
sergeeff
Ну так и с помощью : printf("size of TByte - %d\n", sizeof(TByte)) - выясни, сколько занимает твой объект места в памяти. И очень похоже, что куча твоя имеет всего 32 байта.
Colobox
Совершенно верно: в настройках проекта эта самая near_heap находится в группе "DLIB heap sizes".
Только сейчас осознал, вот, блин... :-)
Сергей Борщ
Цитата(sergeeff @ Aug 27 2008, 08:54) *
Ну так и с помощью : printf("size of TByte - %d\n", sizeof(TByte)) - выясни, сколько занимает твой объект места в памяти.
И не забывайте, что при каждом выделении памяти в куче еще несколько (зависит от реализации) байт резервируются для служебных целей.
sergeeff
Плюс к этому, часто выделяемая память выравнивается на адрес, кратный степени 2, если того требует (или желательно с точки зрения быстродействия) архитектура конкретного процессора, что также может приводить к повышенному "расходу" памяти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.