OberonCore https://forum.oberoncore.ru/ |
|
DevLinker генерирует EXE файл большого размера https://forum.oberoncore.ru/viewtopic.php?f=23&t=2014 |
Страница 1 из 1 |
Автор: | Rifat [ Пятница, 06 Ноябрь, 2009 13:38 ] |
Заголовок сообщения: | DevLinker генерирует EXE файл большого размера |
Использую BlackBox 1.6 rc6. Написал такой модуль: Код: MODULE Sample; TYPE pti = POINTER TO RECORD i: INTEGER; END; pta = POINTER TO RECORD a: ARRAY 500000 OF pti; END; END Sample. Собираю exe файл при помощи команды: DevLinker.LinkExe Test.exe := Sample~ Генерируется exe файл размером почти в 2 мегабайта. Кто-нибудь может объяснить почему так происходит? |
Автор: | Info21 [ Пятница, 06 Ноябрь, 2009 14:09 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
![]() "Смерд на выдумки горазд" (с) ------- Пож., не обижайтесь на "смерда". |
Автор: | Илья Ермаков [ Пятница, 06 Ноябрь, 2009 14:10 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Размер связан не с EXE, а с самим модулем. Посмотрите на размер OCF. Происходит следующее. Для любого RECORD компилятор кладёт в дескриптор типа информацию о смещениях указателей в этой записи. Эта информация потом используется при сборке мусора, отладке и т.п. При этом в дескриптор добавляются смещения и всех подэлементов. Т.е. вообще - позиции, на которых в экземпляре данной записи находятся указатели. Таким образом, для Вашей записи сгенерировано 500000 пунктов. * 4 - как раз 2 Мб. Размер дескриптора типа. Используйте поле POINTER TO ARRAY. |
Автор: | Rifat [ Пятница, 06 Ноябрь, 2009 14:35 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Попробовал сделать с помощью POINTER TO ARRAY, размер стал гораздо меньше. Хотелось бы конечно, чтобы компилятор автоматически распознавал такую ситуацию и не генерировал для каждого указателя запись. |
Автор: | Илья Ермаков [ Пятница, 06 Ноябрь, 2009 14:48 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
А как он должен поступать ещё? Если есть правило - для каждой записи должна быть таблица всех указателей в её экземпляре. Ситуация-то ненормальная с таким массивом, зафигаченным в поле. |
Автор: | Rifat [ Пятница, 06 Ноябрь, 2009 15:01 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Илья Ермаков писал(а): А как он должен поступать ещё? Если есть правило - для каждой записи должна быть таблица всех указателей в её экземпляре. Ситуация-то ненормальная с таким массивом, зафигаченным в поле. Если я определяю тип p = POINTER TO ARRAY 500000 OF some_pointer; то компилятор не генерирует большой exe файл. Конечно, когда выполнится оператор NEW(p) то выделиться память под массив и под дополнительную информацию. Когда я пишу r = POINTER TO RECORD a: ARRAY 500000 OF some_pointer; END; то я ожидаю, что компилятор не будет генерировать большой exe файл (а он почему-то генерирует большой файл), а когда я выполню NEW(r), то выделиться память под массив и под дополнительную информацию. До этого случая я считал, что те две записи, которые я привел, почти эквиваленты, за исключением того, что в первом случае надо будет обращаться к элементу как p[i], а во втором, как r.a[i]. Возможно я не понимаю какой-то принципиальной разницы между POINTER TO ARRAY и POINTER TO RECORD. |
Автор: | Илья Ермаков [ Пятница, 06 Ноябрь, 2009 15:34 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Тут надо понимать, что с точки зрения времени выполнения есть понятие "объект в куче". Указатели указывают на такие "объекты в куче". Объекты в куче делятся на два вида: динамические массивы и записи. Сборщик мусора для массивов смотрит, есть в элементах массива указатели. Если да, то обходит каждый элемент. В случае для записи сборщик обращается к её описателю типа, в котором есть список всех позиций, на которых в экземпляре записи лежат указатели. И идёт по этим указателям. В Вашем первом варианте у Вас нет массива в куче. У Вас в куче лежит именно огромная запись. Следовательно, работает вторая схема. Которая требует, чтобы для данной записи компилятор поместил в дескриптор типа список указательных позиций (которых 500 тыс.). А дескриптор типа - это статический объект. Помещаемый в кодовый файл модуля (и напрямую копируемый потом в память). Вот он и кушает память. |
Автор: | sacred [ Среда, 10 Февраль, 2010 10:39 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Всё же похоже на небольшу недоработку. Можно было бы сделать, чтобы сборка мусора происходила как-то более рекурсивно. Т.е. для записи хранятся описатели только её полей, в случае поля-массива ОДИН описатель. А при работе сборщика мусора, чтоб он обходил все поля с указателями(первая схема), плюс проверял поля-массивы поэлементно (вторая схема). В принципе это мелочь, но для программиста лишняя необходимость знать реализацию среды. Другими словами "особенность". В идеале количество "особенностей" должно быть сведено к минимуму. |
Автор: | Илья Ермаков [ Среда, 10 Февраль, 2010 20:57 ] |
Заголовок сообщения: | Re: DevLinker генерирует EXE файл большого размера |
Да, кое-что на быструю руку сделано. А кое-что вообще с ОС Оберон идёт. GC вообще, насколько я смотрел, даже и в Бутылке совпадает с Блэкбоксовым почти 1-к-1. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |