深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮。

但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?
    书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?
    我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte。如果CCmdTarget中定义100个消息,那其中虚函数表字段大约要占用400字节的内存。
    然后我数了下,MFC中派生自CCmdTarget的类总共有100个,那么这么多类的虚函数表总共需要占用多少个字节呢?
    400Byte*100个=40KB字节。
    然后加上  程序员自己派生的类和消息  所多占的函数指针项,我想也应该不会超过40KB这个基础内存空间的10倍吧?也就是不超过400KB字节的内存。
    然而现在动辄几G的内存,这点消耗大概应该可以忽略不计吧?
   
    所以,我的问题是,如果如书上所说,虚函数的实现方案增加了太多的额外负担,那我以上的计算方法哪里出错了?
    如果我的上述讨论方法正确的话,那是否能说明书上的说法已经过时,而利用虚函数的实现方法,用空间换取执行效率上的提高可行呢?

使用消息映射表将会为每个类产生一个map,包含本类感兴趣的那些消息,占用内存可想而知比先前使用虚函数的方法要小很多,但是迭代的搜寻操会比直接调用虚函数的效率要低。

《深入浅入MFC》侯捷老师当时的硬件环境,书中说到“16MB的内存会让机器工作更舒适”,而他本人所使用的内存是96MB。
而虚函数所带来的额外内存占用应该是 百K级别到M级别。相对于不足100M的内存容量来说确实是巨大的数字。因此,在那个年代,虚函数的实现确实是代价巨大。
然而到了2009年的今天,深入浅出MFC上仍然说虚函数带来巨大的额外负担,应该是有点言过其实了。因为1M以上的消耗对于占用的内存比例应该是绝大部分人能够负担的了。
而使用虚函数方式实现消息映射,可以提高程序运行的效率。

MFC消息映射是宏实现, 占用的是编译时, 毫不影响运行时 ,错误,确实是编译时,这个宏依然是 需要进行函数调用的,而且这个调用是迭代的,他的运行时开销只会比虚函数大,不会小。

在当时限于硬件环境所迫,MS才考虑到牺牲时间来换取空间上的效率,所以这种设计方式在当时确实是起到很大作用的。
但是随着时代的发展,硬件的极大改善,这种方法带来的影响越来越小。但是微软不能从底层上改变设计的思路吧?因为他毕竟要考虑到兼容性问题。而且推翻 WINDOWS 引以为傲的最基本的消息映射表的实现方式,重新开发的成本应该会很高。
但是现在硬件提升的不仅仅只有内存,还有CPU等其他设备,所以消息映射表对于运行时的效率降低也可以忽略不计的。这也应该就是MS没有花大代价去改造WINDOWS系统地原因。

MFC 消息映射表和虚函数实现消息映射到底谁的效率高的更多相关文章

  1. MFC 虚函数与消息映射区别

    初学MFC添加函数时,总是纠结于是 Add  windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理 ...

  2. MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

    CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...

  3. MFC中的几个虚函数

    1.PreTranslateMessage()和WindowProc() PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,通过函数名也可以猜出来.绝 ...

  4. OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)

    这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...

  5. MFC六大核心机制之五、六:消息映射和命令传递

    作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要 ...

  6. C++虚函数的缺陷

    MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数内存开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同,其实这里还有更深层次上的原因,大体说来,多态的底层实现机制只有 ...

  7. c++ virturn function -- 虚函数

    c++ virturn function -- 虚函数 pure irtual function  -- 纯虚函数   先看例子 #include <iostream> using nam ...

  8. 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

    #include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...

  9. C++虚函数工作原理

    一.虚函数的工作原理      虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table poi ...

随机推荐

  1. MongoDB多文档查询

    db.getCollection('transactionCompensation').find( { "$and":[ { "status":{ " ...

  2. 九章算法:BAT国内班 - 课程大纲

    第1章 国内笔试面试风格及准备方法 --- 分享面试经验,通过例题分析国内面试的风格及准备方法 · 1) C/C++部分: 实现 memcpy 函数 STL 中 vector 的实现原理 · 2)概率 ...

  3. ie10以上媒体查询 css

    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { }

  4. Docker命令之 build

    docker build : 使用Dockerfile创建镜像. 语法 docker build [OPTIONS] PATH | URL | - OPTIONS说明: --build-arg=[] ...

  5. 仿网易nec首页动画效果

    仿网页nec首页动画效果nec链接:http://nec.netease.com/ 首先,介绍animationanimation检索或设置对象所应用的动画特效.animation由“keyframe ...

  6. 调用 COM 对象

    调用 COM 对象 大多数 Windows 程序猿都熟悉组件对象模型(Component Object Model,COM).在某程度上..NET 框架 就是为了替换 COM,可是.系统仍然保留了这个 ...

  7. 关于测试中哪些信息需要放到jira上面

    1.每个新需求的功能点,全部在jira上一一呈现 2.每个bug也一样在jira上一一呈现 3.任务一个需要优化改进的点也一一在jira上呈现 然后程序员一直开发新功能和修改新bug,测试人员负责bu ...

  8. [SLAM] 02. Some basic algorithms of 3D reconstruction

    链接:http://www.zhihu.com/question/29885222/answer/100043031 三维重建 3D reconstruction的一个算法思路介绍,帮助理解 首先一切 ...

  9. IOS私有API的使用(转)

    最近在做企业级程序,需要搞设备的udid等信息,但是ios7把udid私有化了,不公开使用.所以研究了一下ios的私有api.   调查了一下文章,发现这方面的文章不多,国内更是不全,高手们都懒得写基 ...

  10. JQuery难点备忘

    1 jquery绑定事件如何传递参数 $("#btn").bind("click",{"id":"111"," ...