Mar*_*rco 4 c compiler-construction interpreter vm-implementation
通常在动态类型编程语言中,对象struct具有用于标识对象类型的标记字段.例如:
struct myObject {
int tag;
...
}
Run Code Online (Sandbox Code Playgroud)
因此,使用基于标记字段的switch语句可以轻松执行不同的操作.例如:
switch (obj->tag) {
case OBJ_INTEGER: ...
case OBJ_STRING: ...
case OBJ_FUNC:...
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我使用了一个void*isa指针而不是int标签字段,该指针指向代表该对象的类.一切正常,我不得不使用优雅的switch语句而不是使用一系列if/else语句.例如:
if (obj->isa == class_integer) {
...
} else if (obj->isa == class_string) {
...
} else if (obj->isa == class_func) {
...
}
Run Code Online (Sandbox Code Playgroud)
我知道我不能在C开关语句中使用指针,但我想知道我是否可以使用一些聪明的技巧来加速if语句系列.
das*_*ght 14
首先拥有isa指针的美妙之处在于能够完全省去switch语句.
考虑一下开关:
switch (obj->tag) {
case OBJ_INTEGER: do_something_int(obj); break;
case OBJ_STRING: do_something_str(obj); break;
case OBJ_FUNC: do_something_func(obj); break;
}
Run Code Online (Sandbox Code Playgroud)
让我们说isa指针指向struct你拥有的一些- 比方说struct dyn_type.添加一个函数指针struct,如下所示:
typedef void (*ProcessPtr)(dyn_obj * obj);
struct dyn_type {
... // fields of your current struct
ProcessPtr process;
};
Run Code Online (Sandbox Code Playgroud)
将process字段设置为do_something_intfor OBJ_INTEGER,do_something_strfor OBJ_STRING等.现在可以替换switch为
((struct dyn_type*)obj->isa)->process(obj)
Run Code Online (Sandbox Code Playgroud)