在Delphi中,我可以链接到外部代码,如下所示:
{$L 'C:UsersJohanDocumentsEmbarcaderoStudioProjectsLife64Lazaruslibx86_64-win64AVXGenerate.o'}
function GenerateQtoP_AVX_32(main, N,W,NW: pointer): byte;
external name 'AVXGENERATE_$$_GENERATEQTOP_AVX_32$POINTER$POINTER$POINTER$POINTER$$BYTE';
function GeneratePtoQ_AVX_32(main, S,E,SE: pointer): byte;
external name 'AVXGENERATE_$$_GENERATEPTOQ_AVX_32$POINTER$POINTER$POINTER$POINTER$$BYTE';
procedure ReverseBitsInAllBytes(ReverseMe: pointer);
external name 'AVXGENERATE_$$_REVERSEBITSINALLBYTES$POINTER';
在这种情况下,它链接到我在Lazarus中编写的AVX2汇编代码。
有没有一种方法可以用这种方式链接类或记录的成员方法?
类似于以下伪代码:
type
TMyRec = record
public
procedure DoSomething(x,y: integer) = ExternalMethod;
不可能随心所欲。我认为,也许你能管理的最接近的方法是用汇编程序跳转到外部函数来实现这个方法:
type
TMyRec = record
public
procedure DoSomething(x, y: integer);
end;
procedure MyRecDoSomething(var Self: TMyRec; x, y: integer); external;
procedure TMyRec.DoSomething(x, y: integer);
asm
JMP MyRecDoSomething
end;
或者您可以创建一个内联方法:
type
TMyRec = record
public
procedure DoSomething(x, y: integer); inline;
end;
procedure MyRecDoSomething(var Self: TMyRec; x, y: integer); external;
procedure TMyRec.DoSomething(x, y: integer);
begin
MyRecDoSomething(Self, x, y);
end;
当调用TMyRec.DoSomething
时,会有一个调用,然后跳转到第一个版本(使用asm
(。对于第二个版本(使用inline
(,有一个对外部函数的直接调用。