Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi如何编译我的代码_Delphi_Optimization_Compiler Construction_Code Generation - Fatal编程技术网

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

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永远不会发生,因此永远不会创建组件组件

当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;