Delphi如何编译我的代码
Delphi编译器将如何编译以下代码Delphi如何编译我的代码,delphi,optimization,compiler-construction,code-generation,Delphi,Optimization,Compiler Construction,Code Generation,Delphi编译器将如何编译以下代码 uses a_big_unit; procedure TForm1.Button1Click(Sender: TObject); var acompont : T_a_big_component ; begin if (true = false ) then // or if false then begin bc := Tbig_component.create(self) end; 在这段代码中,true=false
uses a_big_unit;
procedure TForm1.Button1Click(Sender: TObject);
var
acompont : T_a_big_component ;
begin
if (true = false ) then // or if false then
begin
bc := Tbig_component.create(self)
end;
在这段代码中,true=false永远不会发生,因此永远不会创建组件组件
当delphi在优化模式下编译时,这些未使用的单元和代码会被省略吗
以及使用单位时
在Delphi7中,即使只使用XPMan单元;(不使用任何组件(TXPManifest1)),仍然使用该单元,并且每个组件都显示有主题 有些人说,如果不需要,德尔福将省略单位
因此,Delphi如何识别一个单元是否对它调用的单元有影响,我不能在这里检查,因为我已经多年没有使用Delphi了,但我希望该单元能够被编译并包括在内,因为毕竟它们都存在于代码中。但不会有代码调用它们(至少在那里)。
一个有条件的$IF就可以了。Read。由于您的条件表达式将在编译时解析,优化器将丢弃
然后下的所有语句。但是,不排除整个装置 我在Delphi 2009中使用TTable组件进行了一些测试:
(一)
可执行文件大小=820736字节
现在我对上面的代码做了一些修改:
procedure TForm5.Button1Click(Sender: TObject);
var
T: TTable;
begin
if True then
T:= TTable.Create(nil);
end;
可执行文件大小=844288字节
因此,Delphi linker足够聪明,可以消除大约24K的死掉的TTable代码。请参见:编译代码并在调试器中运行。您将无法在中的任何语句上设置断点,如果为false,则在块中,您将无法在另一个单元中的Tbig_组件类的构造函数中设置任何断点。为什么?因为这些语句没有任何代码
您还可以通过在IDE中打开反汇编视图来查看编译器生成的机器代码。它将显示每个源代码行的机器代码。您会发现,如果为false,则不会为块生成任何机器代码。Delphi编译器足够智能,可以删除未使用的代码。但是,即使您的代码没有直接引用单元的内容,使用的单元仍然可以增加最终可执行文件的大小
如果装置有一个初始化-部分,则该部分中引用的所有代码都将包括在内
如果该单元具有链接资源(如XPMan单元),则这些资源也将包含在您的exe文件中
要绝对确保在需要时排除单元,需要使用如下条件指令:
uses
{$ifdef usebigcomponent}
BigUnit,
{$endif}
SysUils;
在上面的示例中,usebigcomponent是在项目选项中的“条件定义”中定义的,或者使用{$define}指令定义的。未定义usebigcomponent时,将排除该单元。有条件指令会使代码更难阅读,因此您可以决定是否值得使用较小的可执行文件。为什么不如果为false,那么?@Andreas Rejbrand if false意味着if false=true;我的意思是真=假哈哈!检查一下怎么样?在if语句之前放置一个断点(例如使用asm int 3;end;
),运行它,然后检查if语句是否丢失?@Viveeshan häfalse=true
,true=false
和false
是equivalent@CodeInChaos这就是为什么我把LOL放在上一条评论的末尾(LOL=大笑),这取决于单元中的代码(实际使用或通过祖先类和元类访问方法),链接器可能会把它扔掉…@Marjan Venema:不太可能。生成并查看地图文件。@user205376:我想这取决于你们称之为“扔掉”的东西。如果地图文件中提到的唯一一行是单位的结束。
语句,那么无可否认,地图文件中提到了单位,但在我看来,它实际上已经被扔掉了…@Marjan Venema:是的,之所以会这样,是因为链接编辑器是基于每个符号工作的,而相关单位本身也是一个符号,并且引用计数>0(uses子句)即使它包含的任何内容都具有refcount=0并被删除(它不执行任何聚合决策)。例外情况是,如果bigunit有一个引用Tbig_组件的初始化块,则无论如何都会包含它。在这种情况下,您需要在uses子句中为最小大小添加$ifdef away bigunit。在delphi 7中,即使您只使用XPMan;unit(不使用任何组件),仍然使用单元,并且每个组件都显示有主题;delphi编译器是否足够聪明,可以进行ommit或notCorrect-如果单元a是从项目使用的单元B引用的,则单元a的初始化部分将链接到项目中。如果单元初始化代码触及任何类类型,则这些类将为l也已链接。但是,单独引用单元不应导致单元中的类链接到项目中。必须有某些东西引用该类才能使其链接到项目中。注册该类、调用类函数或IS测试可能会导致该类型链接到项目中。@Vibeeshan:the“XP”XPMan中的组件是将XPMan单元添加到uses子句中的一种简单方法。该单元本身实际上包含一个{$R}编译器指令,用于包含实际的清单。清单资源实际上不是“代码”,因此无法对其进行优化。
uses
{$ifdef usebigcomponent}
BigUnit,
{$endif}
SysUils;