在 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;
最佳答案
不可能做你想做的事。我认为也许您可以管理的最接近的方法是通过汇编器跳转到外部函数来实现该方法:
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
)。对于第二个版本(使用内联
),有一个直接调用外部函数的方法。
关于delphi - 我可以将类/记录方法链接到外部模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53337621/