在Delphi中,我可以像这样链接到外部代码:
{$L 'C:\Users\Johan\Documents\Embarcadero\Studio\Projects\Life64\Lazarus\lib\x86_64-win64\AVXGenerate.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;
答案 0 :(得分:3)
无法做您想做的事。我认为,也许您可以管理的最接近的方法是使用汇编程序跳转到外部函数来实现该方法:
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
),可以直接调用一次外部函数。