OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 17 Июнь, 2025 01:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 13:38 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 989
Откуда: Казань
Использую 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 мегабайта.

Кто-нибудь может объяснить почему так происходит?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 14:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
:D

"Смерд на выдумки горазд" (с)

-------
Пож., не обижайтесь на "смерда".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 14:10 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Размер связан не с EXE, а с самим модулем. Посмотрите на размер OCF.

Происходит следующее.
Для любого RECORD компилятор кладёт в дескриптор типа информацию о смещениях указателей в этой записи. Эта информация потом используется при сборке мусора, отладке и т.п.

При этом в дескриптор добавляются смещения и всех подэлементов. Т.е. вообще - позиции, на которых в экземпляре данной записи находятся указатели.

Таким образом, для Вашей записи сгенерировано 500000 пунктов. * 4 - как раз 2 Мб. Размер дескриптора типа.

Используйте поле POINTER TO ARRAY.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 14:35 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 989
Откуда: Казань
Попробовал сделать с помощью POINTER TO ARRAY, размер стал гораздо меньше.
Хотелось бы конечно, чтобы компилятор автоматически распознавал такую ситуацию и не генерировал для каждого указателя запись.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 14:48 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А как он должен поступать ещё?

Если есть правило - для каждой записи должна быть таблица всех указателей в её экземпляре.

Ситуация-то ненормальная с таким массивом, зафигаченным в поле.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Ноябрь, 2009 15:01 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 989
Откуда: Казань
Илья Ермаков писал(а):
А как он должен поступать ещё?

Если есть правило - для каждой записи должна быть таблица всех указателей в её экземпляре.

Ситуация-то ненормальная с таким массивом, зафигаченным в поле.


Если я определяю тип
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 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Тут надо понимать, что с точки зрения времени выполнения есть понятие "объект в куче". Указатели указывают на такие "объекты в куче".

Объекты в куче делятся на два вида: динамические массивы и записи.
Сборщик мусора для массивов смотрит, есть в элементах массива указатели. Если да, то обходит каждый элемент.
В случае для записи сборщик обращается к её описателю типа, в котором есть список всех позиций, на которых в экземпляре записи лежат указатели. И идёт по этим указателям.

В Вашем первом варианте у Вас нет массива в куче. У Вас в куче лежит именно огромная запись.
Следовательно, работает вторая схема. Которая требует, чтобы для данной записи компилятор поместил в дескриптор типа список указательных позиций (которых 500 тыс.). А дескриптор типа - это статический объект. Помещаемый в кодовый файл модуля (и напрямую копируемый потом в память). Вот он и кушает память.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 10:39 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Всё же похоже на небольшу недоработку.
Можно было бы сделать, чтобы сборка мусора происходила как-то более рекурсивно.
Т.е. для записи хранятся описатели только её полей, в случае поля-массива ОДИН описатель. А при работе сборщика мусора, чтоб он обходил все поля с указателями(первая схема), плюс проверял поля-массивы поэлементно (вторая схема). В принципе это мелочь, но для программиста лишняя необходимость знать реализацию среды. Другими словами "особенность". В идеале количество "особенностей" должно быть сведено к минимуму.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 20:57 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, кое-что на быструю руку сделано. А кое-что вообще с ОС Оберон идёт.

GC вообще, насколько я смотрел, даже и в Бутылке совпадает с Блэкбоксовым почти 1-к-1.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB