Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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=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 вся ветка

Форум: "KOL";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
1-1169653503
DevilDevil
2007-01-24 18:45
2007.03.25
WordWrap у Chechbox-а


2-1172873858
arturich
2007-03-03 01:17
2007.03.25
отправить метод post в форму


15-1172662699
TUser
2007-02-28 14:38
2007.03.25
На что живет сеть ICQ?


15-1172649269
Petrovsky
2007-02-28 10:54
2007.03.25
Debuger окончательно заколебал


3-1167223500
wipr
2006-12-27 15:45
2007.03.25
Поломка базы IB (checksum error on database page 38260)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский