к сожалению в асемблере для компов я не силен (совсем слобак

)
и возможно мои методы оценкок не верны (а в корне ошибочны

)
накидав тест имею:
это "некая Офигительная Библиотека"
Код: Выделить всё
unit Unit3;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
pMyRecord=^rMyRecord;
rMyRecord=record
next:pMyRecord;
F0 :integer;
F1 :integer;
F2 :integer;
end;
procedure prcRP_p(const node:pMyRecord); inline;
procedure prcRP_r(const node:rMyRecord); inline;
procedure prcPR_r(var node:rMyRecord); inline;
procedure prcPR_p(const node:pMyRecord); inline;
implementation
procedure prcRP_p(const node:pMyRecord);
begin
with node^ do begin
F2:=F0+F1;
end;
end;
procedure prcRP_r(const node:rMyRecord);
begin
prcRP_p(@node);
end;
procedure prcPR_r(var node:rMyRecord);
begin
with node do begin
F2:=F0+F1;
end;
end;
procedure prcPR_p(const node:pMyRecord);
begin
prcPR_r(node^)
end;
end.
а также способ использования "некой Офигительной Библиотеки"
Код: Выделить всё
unit Unit2;
{$mode objfpc}{$H+}
interface
uses Unit3,
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm2 }
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ private declarations }
public
myRecord:rMyRecord;
end;
pTest=^rTest;
rTest=record
next:pTest;
a :integer;
end;
var
Form2: TForm2;
implementation
function testGetNext_00(var node:pTest):pTest; inline;
begin
result:=node^.next;
end;
function testGetNext_01(const node:pTest):pTest; inline;
begin
result:=node^.next;
end;
function testGetNext_03(const node:rTest):pTest; inline;
begin
result:=node.next;
end;
{ TForm2 }
procedure TForm2.Button1Click(Sender: TObject);
var node:rTest;
p :pTest;
begin
node.a:=10;
p:=@node;
p:=p^.next;
node.a:=11;
p:=@node;
p:=testGetNext_00(p);
node.a:=12;
p:=@node;
p:=testGetNext_01(p);
node.a:=13;
p:=@node;
p:=testGetNext_03(node);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
prcRP_r(myRecord);
{
Unit2.pas:92 prcRP_r(myRecord);
004234CB 89e7 mov %esp,%edi
004234CD 8db074040000 lea 0x474(%eax),%esi
004234D3 fc cld
004234D4 b904000000 mov $0x4,%ecx
004234D9 f3a5 rep movsl %ds:(%esi),%es:(%edi)
004234DB 89e0 mov %esp,%eax
004234DD 8b5004 mov 0x4(%eax),%edx
004234E0 8b4808 mov 0x8(%eax),%ecx
004234E3 01ca add %ecx,%edx
004234E5 89500c mov %edx,0xc(%eax)
Unit2.pas:93 end;
}
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
prcRP_p(@myRecord);
{
Unit2.pas:112 prcRP_p(@myRecord);
00423500 0574040000 add $0x474,%eax
00423505 8b5004 mov 0x4(%eax),%edx
00423508 8b4808 mov 0x8(%eax),%ecx
0042350B 01ca add %ecx,%edx
0042350D 89500c mov %edx,0xc(%eax)
Unit2.pas:113 end;
}
end;
procedure TForm2.Button4Click(Sender: TObject);
begin
prcPR_p(@myRecord);
{
Unit2.pas:126 prcPR_p(@myRecord);
00423520 0574040000 add $0x474,%eax
00423525 8b5004 mov 0x4(%eax),%edx
00423528 8b4808 mov 0x8(%eax),%ecx
0042352B 01ca add %ecx,%edx
0042352D 89500c mov %edx,0xc(%eax)
Unit2.pas:149 end;
}
end;
procedure TForm2.Button5Click(Sender: TObject);
begin
prcPR_r(myRecord);
{
Unit2.pas:140 prcPR_r(myRecord);
00423547 0574040000 add $0x474,%eax
0042354C 890424 mov %eax,(%esp)
0042354F 8b1c24 mov (%esp),%ebx
00423552 8b0424 mov (%esp),%eax
00423555 8b1424 mov (%esp),%edx
00423558 8b4804 mov 0x4(%eax),%ecx
0042355B 8b4208 mov 0x8(%edx),%eax
0042355E 01c1 add %eax,%ecx
00423560 894b0c mov %ecx,0xc(%ebx)
Unit2.pas:153 end;
}
end;
procedure TForm2.Button6Click(Sender: TObject);
begin
with myRecord do begin
F2:=F0+F1;
end;
{
Unit2.pas:158 with myRecord do begin
00423570 0574040000 add $0x474,%eax
Unit2.pas:159 F2:=F0+F1;
00423575 8b5004 mov 0x4(%eax),%edx
00423578 8b4808 mov 0x8(%eax),%ecx
0042357B 01ca add %ecx,%edx
0042357D 89500c mov %edx,0xc(%eax)
Unit2.pas:164 end;
}
end;
{$R *.lfm}
end.
тут есть всякая фигня но интерисуют
Код: Выделить всё
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
и принятая как эталонная копиПаст
Там в теле процедуры, в комментариях, асемблерный код из отладчика.
Просматривая его я замечаю, что вызовы (подставленный вместо их код) не индентичен, из чего делаю вывод что использование процедур из "некой Офигительной Библиотеки" НЕ равнозначно.
хотелось бы 1. услышать мнение знатоков
2. повторить свой вопрос
Brainenjii писал(а):каким образом расставить расставить модификаторы inline, const, var для достижения следующих вещей:1. сосредоточение кода в ЕДИНСТВЕННОМ месте2. оптимальное, по скорости, исполнение кода для обоих модификаций вызова.