Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

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=A9
Теперь пишем
program 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 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
1-1170327389
vtur
2007-02-01 13:56
2007.03.25
Обмен сообщениями между приложениями


15-1172428433
Cyrax
2007-02-25 21:33
2007.03.25
Священные войны по ЯП


10-1130395613
Тёма
2005-10-27 10:46
2007.03.25
ActiveX-компонент в word e без OCX


4-1162877920
Yevgeny
2006-11-07 08:38
2007.03.25
как запустить bat-файл из службы?


2-1173107320
bagos
2007-03-05 18:08
2007.03.25
использование Access