quake3代码C++改写,Cmd_AddCommand改写

一、quake3在性能方面的做了很大的优化,

如:1. 自己的内存分配机制,memzone

      2. 自己的底层函数,memcpy等

 

改写为C++后应该保证系统原来的性能,我主要从以下方面考虑

1。 不使用stl,异常。stl库是c++相对c性能差的主要原因,因此坚决不能用。

2。采用对象缓冲池机制,在系统初始化构造所有对象,尽量避免动态构造对象。

3.  保持原来底层函数,只是简单封装

4.  尽量避免虚函数、多重继承等特性。

 

 

 

 

二、quake3代码虽然是采用c编写,但具有很多面向对象的思想,改写起来还算方便。

但Cmd_AddCommand (实现函数与命令关联的功能)在c语言中采用函数指针实现。

由于c++ 成员函数没有不是函数指针,所以要通过其它方式实现。

1. static 的成员函数,

 这种方法最简单,但无法访问类的成员变量。

 

2. 采用代理实现,代码如下

 

struct handle {
    virtual void invoke(void) = 0;
    virtual ~handle() {}
};

template <class _Ty>
struct delegate : handle {
    typedef void (_Ty::*pfun)(void);
    typedef _Ty  *pcls;

    delegate(pfun the_fun, pcls the_cls)
        : cls(the_cls) ,fun(the_fun) {
            void *p = *(void**)&fun;

    }

    virtual void invoke(void){
        (cls->*fun)();
    }

private:
    pfun fun;
    pcls cls;

};

缺点:采用了虚函数,性能有所损失。

 

3. 采用汇编实现

 

__asm{

     mov ecx cls

     call fun

}

 

cls 为void * 的对象指针

fun 为void * 的成员函数指针

 

采用如下代码,将成员函数指针强制转化为void*

template <class T>
inline void *void_cast(void (T::*f)()){
    return *(void**)(&f);
}

 

缺点:移植性差

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值