gpt4 book ai didi

c++ - 不使用虚函数的多态行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:34 24 4
gpt4 key购买 nike

我正在为微 Controller 开发一种玩具语言,我有一个函数类,它有 11 个虚方法,称为“调用”,从无参数到 10 个参数都采用基对象类并返回对象类(函数还扩展目的)。每当我的语言中有函数定义时,我都会定义一个类来扩展 Function 类并根据其参数实现其中​​一个虚拟方法。每当我想调用一个函数时,我只是将它转换为 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
}
}

Now AFAIK for each class that extends function there will be a virtual function table, and each instance will have a pointer to that table, microcontroller I am doing this for only has 2kb of memory and I am going to have 50 60 functions at least to do basic stuff, so I am looking for ways to avoid using virtual functions. base class also defines a single virtual function that takes a deep copy of itself which is used by containers to copy the object without casting it to a particular type.

EDIT: I have code space lots I can trade code space for ram. As for function pointers, a function object can hold pointers to its state,

(define make-adder 
(lambda (n)
(lambda (x) (+ x n))))

来自 90 分钟方案编译器的示例,我可以将指针传递给 n,因此无论何时它返回一个函数,它都知道 n 是什么。

最佳答案

您的方法存在一个问题,即基类提供了一个约定,暗示每个可能的函数签名对每个可能的函数都有效。 “函数”的用户不知道哪个签名对给定的函数实例有效。他们有吗

   virtual object* call()

   virtual object* call(Object* a)

至少使用函数指针或 boost::function,您可以指定预期的签名:

   void object* (*funcPtr)(Object*);

boost::function< object* (Object*) > boostFunc;

如果你想无论如何都可以调用任何函数,你可以使用boost::bind将任何函数转换为上面签名的函数。然后,您可以轻松地将这些函数存储在一个容器中,并按照您的意愿使用它们。

由于对函数的所有调用都没有执行任何操作,因此您还会在实现过程中浪费周期。由于涉及运行时多态性,编译器可能无法对此进行优化。

关于c++ - 不使用虚函数的多态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780022/

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