virtual function的一些心得
来源:互联网 发布:苹果如何授权软件 编辑:程序博客网 时间:2024/06/05 03:40
原文地址:http://blog.csdn.net/toughbro/article/details/2204345
virtual function是design上一个非常好的东西,它可以在保持面向接口编程的前提下做到运行时刻动态决定使用某一种实现。而且使得代码的语义表达,设计美感都好很多。
问题就是virtual function太费了。
对于pc平台来说,它是乱序执行的cpu,cache miss还可以忍受,对于console平台,这种顺序执行的处理器,cache miss会带来非常大的性能损失。
virtual function table与object在内存上的分离,决定要在很大可能上付出一个额外的cache miss,这是很可惜的。
个人认为,对于virtual的态度可以这样:
- 对于design意义上重要的或者调用率比较低的接口,可以直接virtual,virtual在design上的美感和带来的可读性是很值的,而且如果调用率比较低,那么代价也很小,就没有必要去做一些优化了。
- 对于design要求不高的或者调用频繁的,性能与design的衡量就必要了,这个时侯如果可以的话,可以考虑使用一些变换方式。
变换方式包括:
- 宏包含来做编译时刻可以决定的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 DEBUGtypedef CmdBufDoubleBuffer CmdBufInterface;#elsetypedef CmdBufRingBuffer CmdBufInterface;#endifclass GcmManager{ CmdBufInterface* mCmdBuf; void Init() { mCmdBuf = new CmdBufInterface; }};
- 运行时刻的变换可以是callback函数。这里我原先有个误解,以为callback函数指针地址也要有一个memory访问,所以也会有cache miss,不会有优势。但是我错了,virtual function的访问也需要去访问object的内存,然后跳到virtual table,然后是函数地址。call back只是访问object内存就可以了。而且object内存在load到cache里面之后,在函数中有很大几率又会被访问到,所以这个cache miss很大几率不是白费的,可以得到和正常函数一样的效率。
0 0
- virtual function的一些心得
- virtual function的一些心得
- virtual function的两个优化
- virtual function的两个优化
- Virtual的一些总结
- virtual function
- Virtual function
- virtual function
- virtual function
- Virtual Function
- C++的虚函数 Virtual Function
- 一些常用的FUNCTION
- Function的一些属性
- C++ virtual function (not pure virtual function)
- xml的一些心得!
- Vim的一些心得
- DWR的一些心得
- 一些测试的心得
- Kettle学习笔记一 :MySQL到Postgres导入数据且发送日志邮件
- php CURL的api应用和数字签名
- Credential provider 架构
- Json二次学习、补充
- Percona Toolkit for MySQL
- virtual function的一些心得
- 10-Nancy文档教程——超级简单的视图引擎
- vim 配置项
- 写给自己----大学过半之后(二)
- Hdu 4561 连续最大积 (dp或暴力)
- Flex中Tile结合Repeater的用例
- 如何解决谷歌浏览器Origin null is not allowed by Access-Control-All
- WSDL 概述
- The General Query Log