virtual function的一些心得

virtual function是design上一个非常好的东西,它可以在保持面向接口编程的前提下做到运行时刻动态决定使用某一种实现。

而且使得代码的语义表达,设计美感都好很多。

问题就是virtual function太费了。

对于pc平台来说,它是乱序执行的cpu,cache miss还可以忍受,对于console平台,这种顺序执行的处理器,cache miss会带来非常大的性能损失。

virtual function table与object在内存上的分离,决定要在很大可能上付出一个额外的cache miss,这是很可惜的。

个人认为,对于virtual的态度可以这样:

  1. 对于design意义上重要的或者调用率比较低的接口,可以直接virtual,virtual在design上的美感和带来的可读性是很值的,而且如果调用率比较低,那么代价也很小,就没有必要去做一些优化了。
  2. 对于design要求不高的或者调用频繁的,性能与design的衡量就必要了,这个时侯如果可以的话,可以考虑使用一些变换方式。

变换方式包括:

  1. 宏包含来做编译时刻可以决定的virtual function替换:可以在类表达和接口上保持和virtual function一样的效果,但是却不用付出virtual function的性能损失。表现方式可以是template,可以是typedef,也可以是#define,没有本质区别。这里是个typedef的代码。

     

virtual  function version:

class  CmdBufInterface
{
    
virtual void flip()=0;
}
;

class  CmdBufDoubleBuffer
{
    
virtual void flip(){....}
}
;

class  CmdBufRingBuffer
{
    
virtual void flip(){....}
}
;

class  GcmManager

{
    CmdBufInterface
* mCmdBuf;
    
void Init()
  
{
#if DEBUG
        mCmdBuf 
= new CmdBufDoubleBuffer;
#else
        mCmdBuf 
= new CmdBufRingBuffer;
#endif
  }

}
;

e.g. MY favorate: I think 
this   is  good  for  a replacement of  virtual  function, and no disadvantage of design side.

class  CmdBufDoubleBuffer
{
    
void flip(){....}
}
;

class  CmdBufRingBuffer
{
    
void flip(){....}
}
;
 
#if  DEBUG
typedef  CmdBufDoubleBuffer CmdBufInterface;
#else
typedef CmdBufRingBuffer CmdBufInterface;
#endif

class  GcmManager
{
    CmdBufInterface
* mCmdBuf;
    
void Init()
  
{
        mCmdBuf 
= new CmdBufInterface;
  }

}
;

 

2,  运行时刻的变换可以是callback函数。这里我原先有个误解,以为callback函数指针地址也要有一个memory访问,所以也会有cache miss,不会有优势。但是我错了,virtual function的访问也需要去访问object的内存,然后跳到virtual table,然后是函数地址。call back只是访问object内存就可以了。而且object内存在load到cache里面之后,在函数中有很大几率又会被访问到,所以这个cache miss很大几率不是白费的,可以得到和正常函数一样的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值