![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очистка USES [D7, WinXP]
Stanislav © (2006-07-27 11:08:00)Можно ли каким-то образом автоматически из всех модулей проекта вычистить блок USES, т.е. убрать из него те модули которые нигде не используются
Stanislav (2006-07-28 11:28:00) [41]Плохиш © (28.07.06 10:47) [58]
Нужно внимательно читать ветку. с очисткой Uses помог Игорь Шевченко еще в самом начале.
tButton (2006-07-28 11:16:00) [42]
> >> чудесное
"wonders never cease" (c) =)
@!!ex (2006-07-28 10:59:00) [43]>> чудесноеизбавление от лишних килобайтов веса.
Плохиш (2006-07-28 10:47:00) [44]
> Stanislav © (28.07.06 10:10) [53]
> Я не говорю что из uses нужно удалять модули,
Я плякал. Сабж Пушкин за тебя написал?
> А говорю что ненужны в EXE части кода к которым по логике
> программы никогда не будет обращения
Ты бы хоть книжку какую про делфи почитал. Во всех вроде как описывается работа компилятора делфи и что он(компилятор) делает с неиспользуемым кодом. А то на ум приходит одно определение для таких как ты :-(
tButton (2006-07-28 10:38:00) [45]
> что мы тут обсуждаем то?
чудесное избавление от лишних килобайтов веса.
@!!ex (2006-07-28 10:30:00) [46]Хм.. А если я обращаюсь к куску кода по адресу памяти? и если адрес выясняеться динамическ в процессе работы программы.
ИМХО не реально проанализировать.
Правда такие случаи редки, но все же имееют место.
P.S>
Автор, если прога все хорошо делает, что мы тут обсуждаем то?
Игорь Шевченко (2006-07-28 10:21:00) [47]
> Как определить, что код не используеться?
Путем синтаксического и семантического анализа, чем, собстна, программа, приведенная по ссылке и занимается.
@!!ex (2006-07-28 10:12:00) [48]Хм... Еще раз.
Как определить, что код не используеться?
Stanislav (2006-07-28 10:10:00) [49]atruhin © (27.07.06 19:20) [49]
@!!ex © (27.07.06 19:24) [50]
Что вы приципились к initialization ?
Я не говорю что из uses нужно удалять модули,
А говорю что ненужны в EXE части кода к которым по логике программы никогда не будет обращения. Если в initialization есть код, то в exe к нему будет обращение, а если его нет, то его нет.
Stanislav (2006-07-28 10:06:00) [50]Сергей М. © (27.07.06 17:17) [47]
А я про что. Что в exe войдет целый класс. Но с классом понятно что если что-то из класса используется, то тянется весь класс, а если я ничего не использую, просто забыл убрать из uses модуль, то в exe войдут все классы которые имеются в этом модуле.
Игорь Шевченко (2006-07-27 22:12:00) [51]TUser © (27.07.06 18:01) [48]
> Нельзя этого делать, подключенные модули могут что-то делать
> "неявно" - в секциях initialization и finalization. Если
> просто удалить модули из которы ничего не вызывается - будут
> глюки.
Не должно быть глюков, если только логикой программы не предусмотрено, что должна быть выполнена некая инициализация, но такие неявные программы надо выбрасывать сразу.
atruhin © (27.07.06 19:20) [49]
> Если компилятор удалит этот модуль на который нет ссылок,
> что будет?
Такие модули надо в dpr указывать в секции uses.
Сергей М. © (27.07.06 16:56) [42]
> В ЕХЕ нет никаких секций initialization
Строго говоря, все секции инциализации в порядке использования модулей, заносятся в таблицу, которую обрабатывает код из SysInit.pas и System.pas, но отдельной секции конечно нету.
@!!ex (2006-07-27 19:24:00) [52]>>Я не считаю, где я написал что его нужно исключить?
А если юнит такую секцию имеет, то его уже практически невозможно проанализировать.
А практически все большие юниты, которые как раз и занимают место имеют initialization или finalization.
atruhin (2006-07-27 19:20:00) [53]> Stanislav ©
Вот тебе пример из реального проекта.
Модуль
.....
initialization
RegisterClass(TfrmObjectEditor);
end.
На класс TfrmObjectEditor в программе нет ни одной ссылки, но из БД считывается название редактора для данного класса и вызывается:
var
FormClass : TPersistentClass;
WinClass : TfrmAbstractChild;
begin
Result := nil;
FormClass := GetClass(ClassName);
if Assigned(FormClass) then begin
WinClass := TfrmAbstractChild(FormClass.NewInstance);
(WinClass as ICreateObject).Init(ObjID, ParentID, TypeID, self);
WinClass.Create(self);
Result := (WinClass as ICreateObject);
end;
Если компилятор удалит этот модуль на который нет ссылок, что будет?
TUser (2006-07-27 18:01:00) [54]Нельзя этого делать, подключенные модули могут что-то делать "неявно" - в секциях initialization и finalization. Если просто удалить модули из которы ничего не вызывается - будут глюки.
Сергей М. (2006-07-27 17:17:00) [55]
> Stanislav
Тьфу ты, строго наоборот - не ошибаешься, это действительно так.
Пример ситуации я привел.
Сергей М. (2006-07-27 17:09:00) [56]
> Stanislav © (27.07.06 17:00) [45]
> в EXE-шник включается часть кода, которая по логике программы
> никогда не выполнится
Ошибаешься.
Есть некий юнит, указанный в USES, в котором описан/реализован некий класс
В этом юните есть секция инициализации, в которой этот класс регистрируется.
При этом ни в одном другом юните того же проекта нет ни малейших намеков на обращение к этому классу.
Результат - код юнита в минимально необходимом объеме будет фигурировать в результирующем исп.модуле.
Stanislav (2006-07-27 17:00:00) [57]Сергей М. © (27.07.06 16:56) [42]
>>В ЕХЕ нет никаких секций initialization.
А я тебе прочто. Ты же сам спросил про то что было в 7 посте, вот я и ответил, а сейчас речь идет о EXE и вопрос такой:
в EXE-шник включается часть кода, которая по логике программы никогда не выполнится, зачем ее туда включать, и там уже без разницы Initialization, finalization и т.д.
Ketmar (2006-07-27 16:59:00) [58]вот инетерсно-то... особенно интересно (насчёт выкидывания кода), как определить, какие именно виртуальные методы выкинуть. и как быть, например, с кодоизвратами в VCL в таком случае?
я уж молчу о том, что выкидывание виртуальных методов напрочь несовместимо с пакетами...
Сергей М. (2006-07-27 16:59:00) [59]
> Stanislav
Странно, что тебя не удивляет обязательное присутствие в ЕХЕ кода модуля System - в ран-тайм используется далеко не все, что имеется в этом юните.
Сергей М. (2006-07-27 16:56:00) [60]
> Stanislav © (27.07.06 16:52) [41]
> Можно элементарно спрашивать "нужен ли вам модуль, в котором
> есть Initialization ".
Можно много еще чего спрашивать.
То что не спрошено самим Борландом, то ты можешь сам спросить - на то в IDE предусмотрена поддержка экспертов.
> разговор идет о exe
В ЕХЕ нет никаких секций initialization.
То что компилятор счел необходимым включить в результирующий код, то и будет присутствовать в ЕХЕ.