Отлов утечек памяти - GNAT, (разделено) |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Отлов утечек памяти - GNAT, (разделено) |
volvo |
Сообщение
#21
|
Гость |
После того, как внес изменения (если делал это через IDE) Project -> Save All делал? В настройках проекта Recompile if switches changed стоит? Clean All (в самом крайнем случае) для удаления всех библиотек, и потом пересборка проекта - помогает?
|
TarasBer |
Сообщение
#22
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> В настройках проекта Recompile if switches changed стоит?
Поставил, заработало. Я видел эту галочку, думал, что это как самоочевидное должно быть, поэтому понял её, как "перекомпилировывать только если что-то там менялось", для надёжности я её ставить не стал, потому что помню, как в Дельфи7 я компилировал прогу с какими-то галочками, а потом меня спрашивали - а что это программа выкидывает окно при ненайденном файле? А я смотрю - не стоит галка на проверках ввода-вывода. Что такое, думаю, за бред? А оказалось, что чтобы галочки заработали, надо там вообще всё пересобирать. Вот и не доверяю я частичной пересборке. Кстати, полная сборка там была на порядок быстрее. Сообщение отредактировано: TarasBer - -------------------- |
volvo |
Сообщение
#23
|
Гость |
Ну, там например не было препроцессора. А здесь мало того, что у тебя надо файлы компилировать, так еще и препроцессором проходить теперь надо - это тоже время. Плюс ко всему, скорость сборки зависит от режима (дебаг это или оптимизация, или профайлер). Да и возможностей у языка больше. Но все равно, скорость сборки у Ады на порядки выше С++-ной...
|
TarasBer |
Сообщение
#24
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Ну, там например не было препроцессора.
В таком виде он там был. {$IFDEF} {$ENDIF} я пользовался по полной. Или тут что-то ещё есть? > Плюс ко всему, скорость сборки зависит от режима (дебаг это или оптимизация, или профайлер). Быстрее всего - неоптимизированный неотладочный режим? > Да и возможностей у языка больше. Ну понятно, что шаблоны раскрыть время нужно, хотя с чего бы это, там же не на уровне текста подстановка делается, да и каждый шаблонный пакет у меня в единственном экземпляре инициализируется (кроме вектора). Но даже простой код без фич собирается заметно дольше. -------------------- |
volvo |
Сообщение
#25
|
Гость |
Цитата В таком виде он там был. Это не препроцессор. Вот когда перед компиляцией файла он скармливается внешней программе, которая из него убирает всё ненужное, руководствуясь известными ей директивами и параметрами, переданными в нее - вот это препроцессор. То, что было в Паскаль/Дельфи - это условная компиляция. Причем самая примитивная. ifdef/ifndef/ifopt/else/endif - это все, что есть в Дельфи. А комбинировать условия через Or/And? Я ж могу захотеть и задать несколько ключей, а потом написать{$IFDEF} {$ENDIF} я пользовался по полной. #if Debugging and Test_Leaks -- ... #end if; А получить строковое представление ключа в рантайме? Вот откомпилировал я программу с & ("-gnateDMyStr=""Test"""); , и хочу вывести строку, переданную в MyStr на печать. Как такое сделать в Дельфи? Я-то вот так сделаю: s : String := $MyStr; , и все, обычная строка, что хочешь с ней - то и твори... Цитата Быстрее всего - неоптимизированный неотладочный режим? Да, default в комбобоксе режимов. Хотя у меня есть ощущение, что под Windows этот комбобокс как-то не так работает. Вообще он должен при переключении менять в настройках проекта некоторые свойства, он этого не делает, насколько я помню. Приходится вручную лазить в свойства проекта, и там устанавливать самостоятельно. Хорошо, что хоть компилирует в разные папки... |
TarasBer |
Сообщение
#26
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> А комбинировать условия через Or/And?
or: {$IFDEF COND1} {$DEFINE COND3} {$ENDIF} {$IFDEF COND2} {$DEFINE COND3} {$ENDIF} and: {$IFDEF COND1} {$IFDEF COND2} {$DEFINE COND3} {$ENDIF} {$ENDIF} > А получить строковое представление ключа в рантайме? Зачем это? const S: string = 'test'; -------------------- |
volvo |
Сообщение
#27
|
Гость |
Цитата Зачем это? Затем, что не всегда допустимо править исходники. А иногда - просто невозможно обойтись другими средствами. Вот если я хочу в программу запихать дату и время ее сборки (или характеристики машины, на которой производилась сборка) - твои действия? |
TarasBer |
Сообщение
#28
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Вот если я хочу в программу запихать дату и время ее сборки
А разве константа, определённая через функцию GetTime, не превратится во время сборки (ведь константы считаются компилятором, а не программой при старте)? Аналогично про характеристики - константу определить через GetHardSerialNumber. > Но все равно, скорость сборки у Ады на порядки выше С++-ной... С++ плохой пример по скорости сборки, не надо с ним сравнивать. По поводу самой функции Do_Tree возражений нету, кстати? -------------------- |
volvo |
Сообщение
#29
|
Гость |
Цитата А разве константа, определённая через функцию GetTime, не превратится во время сборки (ведь константы считаются компилятором, а не программой при старте)? Ага, щаззз... with ada.Calendar;А теперь собираем программу и запускаем EXE-шник несколько раз с интервалом в несколько десятков секунд. Что получается? Получается, что текущее время берется при старте программы, а вот потом изменить его программа не даст, ибо constant. Так как быть, если мне надо время/конфиг именно при сборке? Я поступаю просто донельзя: есть скрипт, собирающий в строку всю нужную мне информацию, эта строка передается в gnatprep, и строка жестко зашивается в EXE-шник... |
TarasBer |
Сообщение
#30
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
То есть константы считаются не компилятором, а программой при старте?
Это как-нибудь настраивается? Или считается, что скорость старта программы не важна? Сообщение отредактировано: TarasBer - -------------------- |
volvo |
Сообщение
#31
|
Гость |
Цитата То есть константы считаются не компилятором, а программой при старте? Ada.Calendar.Clock - это все-таки функция. То есть, ты хочешь, чтобы при компиляции еще и вызывались функции, и результат их работы запоминался как обычная константа? Этого не было и не будет никогда. Для простых типов данных - да, компилятор в состоянии описать настоящую константу. Для сложных - нет. Как я могу, скажем, получить истинную константу для Unbounded_String, если мне для этого надо вызвать процедуру Initialize? Только на этапе запуска программы... А вот для Ch : constant Character := 'A'; проблем не будет - для символов ничего не надо выполнять, компилятор подставит сразу нужное значение, еще в compile-time... |
volvo |
Сообщение
#32
|
Гость |
Цитата По поводу самой функции Do_Tree возражений нету, кстати? Я бы немного "разгрузил" функцию от множества if/end if. То есть, вынес бы выброс исключений в отдельные функции (там всего два вида выбрасывается, так что всего 2 доп. функции - Check_IA и Check_BB), по проверке условия. Один фиг, когда ты получаешь исключение - получаешь и Call stack traceback locations, которые можно преобразовать в названия процедур:Ну, и вот так я б не написал: Цитата while Was_Token loop while Was_Token loop |
TarasBer |
Сообщение
#33
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ну это тоже можно.
Гораздо хуже, что операторы и функции слиты в одну ветку, это не нужно, просто была задумка, чтобы каждый оператор мог быть и функцией, но я решил для + и * сделать отдельные функции. Вопрос такой: как переписать через Iterate процедуры To_Vector и Copy_Childs, чтобы выглядело не хуже, чем было? Ещё в выражении не надо писать в конце =, просто парсер молча останавливается, когда видит что-то совсем незнакомое, а текущее выражение корректно обработано. -------------------- |
volvo |
Сообщение
#34
|
Гость |
А что мне надо сделать (какую строку входную заставить обработать), чтоб вызвалось Copy_Childs?
|
TarasBer |
Сообщение
#35
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
В данном случае оно не вызывается, потому что программа нигде не копирует функции. Но мало ли, понадобится, делать limited я не захотел.
-------------------- |
volvo |
Сообщение
#36
|
Гость |
Ну, тогда без проверки:
function To_Vector (A : Key_Arr) return Key_Based_Vectors.Vector is(почему использован Update_Element - ибо не может привести к реаллокации данных ни при каких условиях, следовательно индексация не собьется. Replace_Element от этого не застрахован). И function Copy_Childs (V : Vector) return Vector is |
TarasBer |
Сообщение
#37
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Я так и не понял механизм контролируемых типов. Что именно в описании типа говорит компилятору, что тип контролируем?
Даже если дословно, буква в букву, переписать описание типа Controlled в другой модуль, то для него уже не работает автовызов Initialize и Finalize. Надо, чтобы объект был именно унаследован от типа, называемого именно так-то, находящегося именно в модуле таком-то? Ещё вопрос: почему ссылка на строку - это 64 бита? Указатель на начало и конец строки? Или указатель на начало и на длину? Как хранятся дин массивы в памяти? Выделяются на стеке? Где хранятся их границы? Если выделяются на стеке, то где выделяются локальные переменные, объявленные после них, как хранятся ссылки на локальные переменные, объявленные до них? Сообщение отредактировано: TarasBer - -------------------- |
volvo |
Сообщение
#38
|
Гость |
Цитата Даже если дословно, буква в букву, переписать описание типа Controlled в другой модуль, то для него уже не работает автовызов Initialize и Finalize Если дословно (буква в букву) переписать все, что нужно в другой модуль - то он у тебя даже не откомпилируется. Потому какgnatmake -ws -c -u -P/home/forum_test/forum.gpr my_con.ads --subdirs=debug -cargs -g -O0 Finalization_Root - это внутренний пакет, нельзя его использовать в своих целях. Это жестко зашито в GNAT. Цитата Ещё вопрос: почему ссылка на строку - это 64 бита? Указатель на начало и конец строки? Или указатель на начало и на длину? Смотри. Во-первых, это только в GNAT-компиляторе. Во всех остальных для access-типов всегда используются только thin-pointers (ага, худые). В GNAT-е же для неограниченных типов (массивы, строки, без жесткого указания длины, всякие Unbounded_String-и) используется "fat pointer" - это два указателя: один - на данные, другой - на границы массива. Но это, насколько я помню, отключаемо. Можно заставить компилятор всегда использовать thin-pointers, но это может сказаться на производительности.Цитата Как хранятся дин массивы в памяти? Выделяются на стеке? Динамические - это какие? Вот эти:procedure P(N : Integer) is? Или которые через new выделяются? Сообщение отредактировано: volvo - |
-TarasBer- |
Сообщение
#39
|
Гость |
> Это жестко зашито в GNAT.
То есть работает именно с типом, унаследованного именно от Controlled из именно этого пакета? > Динамические - это какие? Динамические - это которые в declare пишутся.
...итд В голове только одна идея - сначала вычисляется, где на стеке будут лежать переменные с известным размером (и указатели на массивы), и ставятся подряд, а массивы аллоцируются на стеке (при этом локальные переменные известного размера и указатели на массивы адресуются относительно esp, а ebp сдвигается за массив), и так как их расположение уже не предсказать на этапе компиляции, обращение к ним идёт через указатель. |
volvo |
Сообщение
#40
|
Гость |
Хм. Ну, разницы с тем, что я привел - никакой. И там и там на этапе компиляции размер определить нельзя, поэтому компилятор использует одинаковую стратегию. Почитать об этом можно в книге Michael L. Scott "Programming Language Pragmatics" (перевода не видел, к сожалению).
Вот тут есть кусками: Как раз на нужной странице, если надо полную версию - скажи, я положу куда-нибудь, там около 8 Мб... |
Текстовая версия | 11.01.2025 13:07 |