gpt4 book ai didi

delphi - 有没有办法在编译时声明对方法的 const 引用?

转载 作者:行者123 更新时间:2023-12-03 14:40:05 26 4
gpt4 key购买 nike

我正在开发一个脚本解释器,我已经设法使其进入工作状态。它有一个解析脚本并生成字节码的编译器,以及一个执行字节码的虚拟机。

解释器的核心是一个带有巨大 case 语句的循环,如下所示:

case CurrentOpcode.Operation of
OP_1: DoOp1(CurrentOpcode);
OP_2: DoOp2(CurrentOpcode);
...
OP_N: DoOpN(CurrentOpcode);
end;

分析告诉我,无论出于何种原因,我的脚本执行在 case 语句中花费了大量时间,这对我来说似乎很奇怪,所以我正在寻找一种优化方法它。由于所有操作函数基本上都具有相同的签名,因此显而易见的解决方案是创建一个由操作码的 Operation 值索引的方法指针数组。但是 Operation 被声明为枚举,如果能够将其声明为 const 数组就好了,这样如果我将来添加更多操作码,编译器可以提醒我更新数组.

由于方法指针存储运行时状态(对其运行的对象的Self引用),我无法创建方法指针的常量数组。 (无论如何,这也不是一个好主意,因为我很可能最终会同时运行多个脚本。)但无论如何,方法只是语法糖。像这样的东西:

procedure TMyObject.DoSomething(x, y: integer);

真正的意思是:

procedure TMyObject_DoSomething(Self: TMyObject; x, y: integer);

所以我应该能够以后一种形式声明函数指针类型并以这种方式分配它,然后在调用它时我只需要显式传递 Self 作为第一个参数。但编译器不喜欢这样。

type TOpcodeProc = procedure (Self: TScriptVM; Opcode: TOpcode);
const OPCODE: TOpcodeProc = TScriptVM.DoOp1;

[DCC Error]: E2009 Incompatible types: 'regular procedure and method pointer'

我尝试了不同的变体来尝试编译它,但它们都给出了错误。有什么办法让它编译吗?

最佳答案

声明:

const
OPCODE: array[TOperation] of Pointer = (
@TScriptVM.DoOp1,
@TScriptVM.DoOp2,
...
@TScriptVM.DoOpN
);

调用:

TOpcodeProc(OPCODE[CurrentOpcode.Operation])(Self, CurrentOpcode);

更多很酷的东西:

var
OpCodeProcs: array[TOperation] of TOpCodeProc absolute OPCODE;

调用该方法的语法更好:

OpCodeProcs[CurrentOpcode.Operation](Self, CurrentOpcode);

好的事情是,由于常量的绝对值,编译器会阻止您向 OpCodeProcs 变量分配某些内容!

关于delphi - 有没有办法在编译时声明对方法的 const 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com