Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Record als Prozedurparameter: Werte direkt übergeben

  Alt 17. Jul 2018, 08:30
Dumme Frage: Macht es praktisch einen Unterschied ob man dem Record nun eine static class function Init(..) oder einen constructor Create(..) gibt?
Schauen wir es uns anhand eines praktischen Beispiels an:

Delphi-Quellcode:
program Project5;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.SysUtils;

type
  TMyRecord2 = record
    FeldB: Integer;
    class function Init(AFieldB: Integer): TMyRecord2; static;
  end;

  TMyRecord = record
    FeldB: Integer;
    constructor Create(AFieldB: Integer);
  end;

  { TMyRecord }

constructor TMyRecord.Create(AFieldB: Integer);
begin
  FeldB := AFieldB;
end;

{ TMyRecord2 }

class function TMyRecord2.Init(AFieldB: Integer): TMyRecord2;
begin
  Result.FeldB := AFieldB;
end;

var
  MyRecord: TMyRecord;
  MyRecord2: TMyRecord2;

begin
  MyRecord := TMyRecord.Create(123);
  MyRecord2 := TMyRecord2.Init(123);
end.

Ergibt für die beiden Zuweisungen folgenden Assembler-Code:

Code:
Project5.dpr.41: MyRecord := TMyRecord.Create(123);
0041C554 8D45EC          lea eax,[ebp-$14]
0041C557 BA7B000000       mov edx,$0000007b
0041C55C E873D7FFFF      call TMyRecord.Create
0041C561 8B45EC          mov eax,[ebp-$14]
0041C564 A3B8484200       mov [$004248b8],eax
Project5.dpr.42: MyRecord2 := TMyRecord2.Init(123);
0041C569 B87B000000       mov eax,$0000007b
0041C56E E87DD7FFFF      call TMyRecord2.Init
0041C573 A3BC484200       mov [$004248bc],eax
Code:
Project5.dpr.25: begin
00419CD4 55               push ebp
00419CD5 8BEC            mov ebp,esp
00419CD7 83C4F8           add esp,-$08
00419CDA 8955F8           mov [ebp-$08],edx
00419CDD 8945FC          mov [ebp-$04],eax
Project5.dpr.26: FeldB := AFieldB;      // Zuweisung im Create
00419CE0 8B45FC          mov eax,[ebp-$04]
00419CE3 8B55F8           mov edx,[ebp-$08]
00419CE6 8910             mov [eax],edx
Project5.dpr.27: end;
00419CE8 8B45FC          mov eax,[ebp-$04]
00419CEB 59               pop ecx
00419CEC 59               pop ecx
00419CED 5D              pop ebp
00419CEE C3               ret
00419CEF 90               nop
Project5.dpr.32: begin
00419CF0 55               push ebp
00419CF1 8BEC            mov ebp,esp
00419CF3 83C4F8           add esp,-$08
00419CF6 8945FC          mov [ebp-$04],eax
Project5.dpr.33: Result.FeldB := AFieldB;     // Zuweisung im Init
00419CF9 8B45FC          mov eax,[ebp-$04]
00419CFC 8945F8           mov [ebp-$08],eax
Project5.dpr.34: end;
00419CFF 8B45F8           mov eax,[ebp-$08]
00419D02 59               pop ecx
00419D03 59               pop ecx
00419D04 5D              pop ebp
00419D05 C3               ret
00419D06 8BC0             mov eax,eax
  Mit Zitat antworten Zitat