virtual function的一些心得
为什么80%的码农都做不了架构师?>>>
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的代码。
class CmdBufInterface
... {
virtual void flip()=;
} ;
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很大几率不是白费的,可以得到和正常函数一样的效率。
原文链接: http://blog.csdn.net/ccanan/article/details/2204345
转载于:https://my.oschina.net/dtec/blog/44716
virtual function的一些心得相关推荐
- C++中的虚函数(virtual function)
1回顶部 一.简介 虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: class A { public: virtua ...
- 虚函数(Virtual Function)与 纯虚函数(Pure Virtual Function)
1>虚函数(Virtual Function) 1.1>Base Class #ifndef Animal_h #define Animal_h #include <string&g ...
- [C++] Pure Virtual Function and Abstract Class
Pure Virtual Function Abstract Class 转载于:https://www.cnblogs.com/tianhangzhang/p/4966722.html
- C++ 中的Virtual Function (虚函数)
1.C++ Virtual 用法 这里只讲语法,因为讲原理比较难.还没有涉及到构造函数.那么就直接上代码了: // VitualFunction.cpp : Defines the entry poi ...
- Pure Virtual Function
Pure Virtual Function • If a base class has no natural implementation for a virtual function, then t ...
- 记一个bug : C2555 overriding virtual function return type differs and is not covariant from
今天同事遇到一个编译错误找我帮忙看一下.原以为编译错误应该好解决,没想到搞了半天才fix,在此记录一下. 由于公司代码涉及机密且比较复杂,不方便贴出来,因此我写了一个简化的例子来展示这个编译错误是如何 ...
- 运行opencv程序后出现runtime error! R6025-pure virtual function call 错误提示的解决方法
运行opencv的代码,主函数(main)返回时产生了runtime error! R6025-pure virtual function call 的错误提示,若程序前面的所有代码都没有问题,就到最 ...
- R6025 pure virtual function call
出现了 R6025 pure virtual function call 这个错误,今天上午调试程序的时候. 后来问了公司的前辈,知道了,原来我继承了一个类,该类中有个 纯虚函数. 重写了这个函数,但 ...
- mindmanager的R6025 - pure virtual function call错误解决办法
原文链接:mindmanager的R6025 - pure virtual function call错误解决办法 今天发现了一个问题:mindmanager打不开文件了 提示: ---------- ...
最新文章
- PAT (Advanced Level) 1078. Hashing (25)
- DB_Links创建际删除
- Node HTTP/2 Server Push 从了解到放弃
- Android之Pull解析XML
- ecshop 删除订单时提示“以下订单无法被移除”的解决办法
- nodejs 快速搭建接口
- Java多线程之一:进程与线程
- 消息队列mysql redis那个好_Redis作为消息队列与RabbitMQ的比较
- 第三代英特尔至强可扩展处理器,英特尔数据中心的“芯法宝”
- html如何移动整体列表,移动端H5各种各样的列表的制作方法(一)
- win32开发(画笔、刷子、字体)
- java 内存分配参数_浅谈JAVA内存分配与参数传递
- 前端----JQuery
- 大数据要学javaweb吗_学习大数据需要学习javaee的内容吗?
- Eclipse的使用-Eclipse的简单使用,需要的来看看吧!
- 复旦sakai安装指南
- 图文介绍 Presto + Velox 整合
- bvlc_googlenet.caffemodel模型及描述文件地址
- cheng@ARM结构与编程之day3-MOV LSL
- 使用阿里云创建个人云盘