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가 생성되지 않습니다.

델파이 최적화 모드에서 컴파일하는 이러한 미사용 단위 코드

을 생략 것이다

방금 ​​XPMan 수단을 사용하더라도, 델파이 7 단위

을 사용함; (가지고있는 구성 요소를 사용하지 않고 (TXPManifest1)), 여전히 장치가 사용되고 모든 구성 요소가 테마로 표시됩니다.

그리고 필요하지 않은 경우 델파이는 단위를 생략합니다.

그래서 델파이 단위가 그것을 호출 장치 여부에 영향이 있는지 여부를 식별하는 방법

+0

왜 거짓이면? –

+3

@Andreas Rejbrand 거짓이면 거짓 = true를 의미하고 그렇지 않으면 false를 의미합니다. 그리고 나는 사실 = 거짓 LOL을 의미했다! – VibeeshanRC

+0

그냥 확인하는 건 어떨까요? if 문 앞에 중단 점 (예 :'asm int 3; end;')을 넣고 실행 한 다음 if 문이 누락되었는지 확인하십시오. – CodesInChaos

답변

6

직접 확인하십시오 : 코드를 컴파일하고 디버거에서 실행하십시오. if false then 블록 안의 명령문에 중단 점을 설정할 수 없으므로 다른 유닛의 Tbig_component 클래스 생성자에 중단 점을 설정할 수 없습니다. 왜? 이 문장에 대한 코드가 없기 때문입니다.

IDE의 [디스 어셈블리] 뷰를 열어 컴파일러에서 생성 한 머신 코드를 볼 수도 있습니다. 각 소스 행에 대한 기계 코드가 표시됩니다. if false then 블록에 대해 생성 된 기계 코드가 없음을 알 수 있습니다.

+0

bigunit에 Tbig_component를 참조하는 초기화 블록이있는 경우 예외입니다. 그렇다면 어쨌든 포함될 것입니다. 이 경우 최소 크기를 위해 uses 절에서 $ ifdef bigunit을 사용해야합니다. –

+0

XPMan 만 사용하는 경우에도 a_big_unit이 생략되거나 – VibeeshanRC

+0

이 델파이 7에 없다는 메시지가 표시됩니다. 유닛 (가지고있는 구성 요소를 사용하지 않고), 유닛이 사용되며 모든 구성 요소가 테마로 표시됩니다. 델파이 컴파일러가 적당하지 않을 때 – VibeeshanRC

0
그것이 내가 더 이상 델파이를 사용하지 않는 년이기 때문에 여기에서 확인할 수 없습니다,하지만 난 장치를 기대

컴파일하고 포함 할 왜냐하면 결국 그들은 코드에 존재하기 때문입니다. 그러나 그들을 호출하는 코드는 없을 것입니다 (적어도 거기에). 대신 조건부 $ IF가 트릭을 수행해야합니다.

1

this paragraph을 읽으십시오. 조건식이 컴파일 타임에 해결되기 때문에 옵티마이 저는 then 아래의 명령문을 버립니다. 그러나 전체 단위는 제외되지 않습니다. 델파이 2009 년 TTable 구성 요소를 사용하여 몇 가지 테스트를 만들었습니다

+0

유닛의 코드 (조상과 메타 클래스를 통한 메소드의 실제 사용 또는 접근 가능성)에 따라 링커가이를 버릴 수도 있습니다. –

+0

@Marjan Venema : 그렇지 않습니다. 지도 파일을 생성하고 봅니다. –

+1

@ user205376 : 그것은 당신이 "던지기"라고 부르는 것에 달려 있습니다. 맵 파일에 언급 된 유일한 행이 ** 유닛의''end .' 명령문이면 맵 파일에 유닛이 언급되어 있지만 내 생각에 효과적으로 그 유닛이 튕겨져 나온 것입니다 ... –

1

:

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. 

실행 파일 크기 = 820,736 바이트.

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

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

실행 파일 크기 = 844,288 바이트 :

는 지금은 약간 위의 코드를 변경했습니다.

그래서 델파이 링커는 약 24K의 죽은 TTable 코드를 제거 할 정도로 똑똑합니다.

+0

예 그렇지만 여전히 유닛은 linkeed입니다. – VibeeshanRC

0

델파이 컴파일러는 사용하지 않는 코드를 제거 할만큼 똑똑합니다. 그러나 사용 된 유닛은 코드가 유닛의 내용을 직접 참조하지 않더라도 최종 실행 파일에 크기를 추가 할 수 있습니다.

유닛에 초기화 - 섹션이 있으면 섹션에 참조 된 모든 코드가 포함됩니다.

링크 된 리소스가 인 경우 (예 : XPMan- 장치) 리소스가 EXE 파일에도 포함됩니다. 에 usebigcomponent 위의 예에서

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

는 "Conditinal가 정의"에 정의되어

당신이 그것을 할 때이 같은 조건 지시어를 사용해야합니다에 유닛을 제외 절대적 확인하십시오 프로젝트 옵션을 사용하거나 {$ define} 지시어를 사용합니다. usebigcomponent가 정의되지 않으면 유닛이 제외됩니다. 조건부 지시문을 사용하면 코드를 읽기가 어려워 지므로 작은 실행 파일에 적합하다고 생각 하느냐에 따라 결정됩니다.

관련 문제