0

Delphi編譯器如何編譯下面的代碼;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將永遠不會發生,所以組件acompont永遠不會創建。

時Delphi是在優化模式編譯將這些未使用的單元和代碼被省略

以及當使用單位

在Delphi 7,即使只是使用XPMan單元; (不使用任何組件(TXPManifest1)),仍使用該單元,並且每個組件都顯示爲主題;

和一些說德爾福會省略單位,如果不需要的話;

所以德爾福如何識別一個單位是否具有它調用本機或不產生影響

+0

爲什麼不`如果假然後`? – 2010-12-04 14:23:07

+3

@Andreas Rejbrand如果false表示false = true;我的意思是true = false LOL! – VibeeshanRC 2010-12-04 14:29:38

+0

如何檢查?在if語句之前放置一個斷點(例如用`asm int 3; end;`),運行它,然後檢查if語句是否丟失? – CodesInChaos 2010-12-04 14:31:30

回答

6

親眼看看:編譯代碼並在調試器中運行它。您將無法在if false then塊內的任何語句上設置斷點,並且您將無法在另一個單元的Tbig_component類的構造函數中設置任何斷點。爲什麼?因爲這些語句沒有任何代碼。

您還可以通過打開IDE中的反彙編視圖來查看編譯器生成的機器碼。它將顯示每個源代碼行的機器代碼。您會發現將不會爲if false then塊生成機器碼。

0

我不能在這裏檢查,因爲這是我沒有用delphi了多年,但我希望的單位進行編譯,其中包括,因爲畢竟它們出現在代碼中。但是沒有代碼可以打電話給他們(至少在那裏)。 有條件的$ IF應該做的伎倆。

1

閱讀this paragraph。由於您的條件表達式將在編譯時解決,所以優化器將拋棄then下的任何語句。但是,整個單位不會被排除。

1

我在2009年Delphi利用TTable組件做了一些試驗:

1)

unit Unit5; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, DB, DBTables, StdCtrls; 

type 
    TForm5 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    end; 

var 
    Form5: TForm5; 

implementation 

{$R *.dfm} 

procedure TForm5.Button1Click(Sender: TObject); 
var 
    T: TTable; 

begin 
    if False then 
    T:= TTable.Create(nil); 
end; 

end. 

可執行大小= 820736個字節。

現在我已經改變了上述代碼一點:

procedure TForm5.Button1Click(Sender: TObject); 
var 
    T: TTable; 

begin 
    if True then 
    T:= TTable.Create(nil); 
end; 

可執行大小= 844288個字節。

因此,Delphi鏈接器足夠聰明,可以消除大約24K的死亡TTable代碼。

0

Delphi編譯器足夠聰明,可以刪除未使用的代碼。但是,即使您的代碼沒有直接引用該單元的內容,但所使用的單元仍然可以將大小添加到最終的可執行文件中。

如果該單元已獲得初始化-section,則將包含該部分中引用的所有代碼。

如果單位已獲得鏈接資源(如XPMan單元),那麼這些資源也將包含在您的exe文件中。

絕對確保,當你想它的單位是排除你將需要使用條件指令是這樣的:

uses 
    {$ifdef usebigcomponent} 
    BigUnit, 
    {$endif} 
    SysUils; 

在上面usebigcomponent的例子是「Conditinal定義」中定義項目選項或通過使用{$ define}指令。當usebigcomponent未定義時,該單位將被排除。條件指令會讓你的代碼難以閱讀,所以你認爲它是否適合較小的可執行文件取決於你。