我正在研究微控制器的玩具语言,我有一个Function类,它有11个虚拟方法,从无参数调用"call"到10个参数,所有参数都采用基础对象类并返回一个对象类(函数也扩展了对象).当我的语言中有函数定义时,我定义了一个扩展Function类的类,并根据其args实现一个虚方法.每当我想调用一个函数时,我只需将其转换为Function*并使用其参数调用其调用方法.所以我有类似下面的东西,
class object {}
//other types that extend object
class Function : public object{
virtual object* call(){}
virtual object* call(Object* a){}
//....
}
//
// then during code generation I define
//
class s243 : public Function{
Object* call(){
//do somthig
}
}
现在扩展函数的每个类的AFAIK将有一个虚函数表,每个实例都有一个指向该表的指针,我正在做的这个微控制器只有2kb的内存,我将至少有50个60函数做基本的东西,所以我正在寻找避免使用虚函数的方法.基类还定义了一个虚拟函数,它接受自身的深层副本,容器使用它来复制对象而不将其强制转换为特定类型.
编辑:我有代码空间很多我可以为ram交易代码空间.对于函数指针,函数对象可以保存指向其状态的指针,
(define make-adder
(lambda (n)
(lambda (x) (+ x n))))
Run Code Online (Sandbox Code Playgroud)
从90分钟方案编译器的一个例子,我可以传递一个指向n的指针,所以当它返回一个函数时,它知道n是什么.
为什么不使用函数指针的查找表(数组)而不是继承?下面的代码是一个快速而肮脏的伪代码,可能无法编译,但应该给您一个总体思路。
enum Functions
{
Func1 = 0,
Func2 = 1
};
void *FunctionPointers[] = { &Function1, &Function2 };
FunctionPointers[Func1]( some_parameter);
Run Code Online (Sandbox Code Playgroud)