Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизSmart-Linking Найти похожие ветки
← →
DevilDevil © (2006-06-23 03:27) [0]Как оформлять свои модули функций, чтобы неиспользуемые не "прилинковывались"?
Эта технология используется в KOL
← →
AndreyRus (2006-06-23 09:38) [1]Для того чтобы код функций не добавлялся в выполняемый файл просто не вызывайте их в программе :)
← →
DevilDevil © (2006-06-23 11:10) [2]Нет, а самому как оформлять свои собственные функции?
← →
ECM © (2006-06-23 11:30) [3]Неиспользуемые функции из скомпилированных модулей (DCU) не линкуются в исполняемый файл, если на них нет ссылок из основного модуля (других модулей). Т.е. вобщем принцип верный - не вызывайте - оно и не будет включено в загружаемый модуль(exe,dll). Но есть несколько моментов, если так можно выразится, неявного вызова функций. Например:
1) Тривиальный случай - вызов функции из другой функции этого же(другого)
модуля. Т.е. чем меньше взаимозависимости между функциями в модуле - тем лучше. Но, разумеется, до известных пределов :) (Чтобы не было дублирования кода)
2) Вызов функции внутри секций Initialization,Finalization. Эти секции это тоже своего рода функции, но они вызываются run-time библиотекой на этапе загрузки-выгрузки модуля. Т.е. прежде чем вводить код в эти секции нужно "трижды всё взвесить" - лучше дать шанс пользователю-программисту самому решить нужны ли ему эти действия в программе или нет...:)
3) Ну и функция будет включена в загружаемый модуль если это виртуальный метод. Даже если он реально нигде не вызывается. Просто компилятор всегда включает ссылку на виртуальный метод в VMT (таблицу вмртуальных методов) объекта (класса). Соответсвенно линковщик найдя такую ссылку просто обязан поместить этот код в загружаемый модуль. По этому же поводу почитайте
http://bonanzas.rinet.ru/rart001.htm
Но принцип остаётся одним - функция не попадет в конечный модуль, если на неё нет ссылок (тут главное понимать когда эти ссылки могут появляться :)
из других функций, уже попавших туда...
← →
ECM © (2006-06-23 11:47) [4]> 2) Вызов функции внутри секций Initialization,Finalization.
P.S. Забыл добавить... Именно наличие кода в этих секциях, что характерно для многих VCL модулей, приводит к тому что после простого внесения этого модуля в uses - размер программы резко вырастает.(Этот код вызывает какие-то свои функции - те из других модулей, опять же через uses этого модуля тянуться секции инициализации-финализации других - вобщем "снежный ком" )
← →
DevilDevil © (2006-06-23 13:46) [5]Если в своей API программе я просто напишу uses SysUtils, то размер проги не увеличится. Зато если ниже написать S := IntToStr(15), то прилинкуется весь модуль, все ... ~20 кб
← →
miek © (2006-06-23 14:23) [6]Вот поэтому лучше использовать Int2Str из состава KOL.
← →
ECM © (2006-06-23 14:31) [7]> Если в своей API программе я просто напишу uses SysUtils,
> то размер проги не увеличится
Это Вам явно показалось....:)
D6, (оптимизация включена) пишем:
1)program Project1;
begin
end.
Компилируем - получается 8192 байтаStart Length Name Class
Теперь пишем
0001:00000000 00000E8CH .text CODE
0002:00000000 00000090H .data DATA
0002:00000090 000006E5H .bss BSS
Detailed map of segments
0001:00000000 00000CEB C=CODE S=.text G=(none) M=System ACBP=A9
0001:00000CEC 00000140 C=CODE S=.text G=(none) M=SysInit ACBP=A9
0001:00000E2C 0000005D C=CODE S=.text G=(none) M=Project1 ACBP=A9
0002:00000000 00000078 C=DATA S=.data G=DGROUP M=System ACBP=A9
0002:00000078 00000018 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9
0002:00001000 000006CC C=BSS S=.bss G=DGROUP M=System ACBP=A9
0002:000016CC 00000018 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9program Project1;
uses SysUtils;
begin
end.
Компилируем - и вот Вам все 38912 байтаStart Length Name Class
0001:00000000 000121F8H .text CODE
0002:00000000 000006F8H .data DATA
0002:000006F8 000009D1H .bss BSS
Detailed map of segments
0001:00000000 00004AAB C=CODE S=.text G=(none) M=System ACBP=A9
0001:00004AAC 00000140 C=CODE S=.text G=(none) M=SysInit ACBP=A9
0001:00004BEC 00000038 C=CODE S=.text G=(none) M=Types ACBP=A9
0001:00004C24 00000108 C=CODE S=.text G=(none) M=Windows ACBP=A9
0001:00004D2C 00000310 C=CODE S=.text G=(none) M=SysConst ACBP=A9
0001:0000503C 0000473C C=CODE S=.text G=(none) M=SysUtils ACBP=A9
0001:00009778 00000184 C=CODE S=.text G=(none) M=VarUtils ACBP=A9
0001:000098FC 0000886C C=CODE S=.text G=(none) M=Variants ACBP=A9
0001:00012168 0000008D C=CODE S=.text G=(none) M=Project1 ACBP=A9
0002:00000000 00000088 C=DATA S=.data G=DGROUP M=System ACBP=A9
0002:00000088 00000018 C=DATA S=.data G=DGROUP M=SysInit ACBP=A9
0002:000000A0 00000244 C=DATA S=.data G=DGROUP M=SysUtils ACBP=A9
0002:000002E4 00000108 C=DATA S=.data G=DGROUP M=VarUtils ACBP=A9
0002:000003EC 00000172 C=DATA S=.data G=DGROUP M=Variants ACBP=A9
0002:00001000 00000704 C=BSS S=.bss G=DGROUP M=System ACBP=A9
0002:00001704 00000018 C=BSS S=.bss G=DGROUP M=SysInit ACBP=A9
0002:0000171C 00000004 C=BSS S=.bss G=DGROUP M=Types ACBP=A9
0002:00001720 00000004 C=BSS S=.bss G=DGROUP M=Windows ACBP=A9
0002:00001724 00000004 C=BSS S=.bss G=DGROUP M=SysConst ACBP=A9
0002:00001728 00000120 C=BSS S=.bss G=DGROUP M=SysUtils ACBP=A9
0002:00001848 00000004 C=BSS S=.bss G=DGROUP M=VarUtils ACBP=A9
0002:0000184C 00000184 C=BSS S=.bss G=DGROUP M=Variants ACBP=A9
:)
Причина?unit SysUtils;
...initialization
if ModuleIsCpp then HexDisplayPrefix := "0x";
InitExceptions;
{$IFDEF LINUX}
SafeCallErrorProc := @SafeCallError;
ExitProcessProc := PropagateSignals;
CheckLocale;
{$ENDIF}
{$IFDEF MSWINDOWS}
InitPlatformId;
InitDriveSpacePtr;
{$ENDIF}
GetFormatSettings; { Win implementation uses platform id }
finalization
{$IFDEF MSWINDOWS}
FreeAndNil(FLanguages);
{$ENDIF}
{$IFDEF LINUX}
if libuuidHandle <> nil then
dlclose(libuuidHandle);
{$ENDIF}
FreeTerminateProcs;
DoneExceptions;
end.
+ Initialization-Finalization модуля Variants который SysUtils за собой тянет и т.д. и т.п
← →
DevilDevil © (2006-06-25 12:32) [8]Теперь понятно. Спасибо!
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c