消息映射比虚拟函数好在哪?

x8710162 2009-03-16 10:14:05
RT,看书上都说用虚拟函数会比消息映射慢,因为存在虚拟函数表,开销大。但看消息映射的实现,它也定了一个消息映射表来存储消息的映射关系,同样也要查表来调用消息处理函数,在开销看不出哪有少!请问,消息映射到底在哪比虚拟函数效率高了?好在哪了?
...全文
405 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2009-03-17
  • 打赏
  • 举报
回复
俺觉得消息是多种多样的。
rdsnow 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cnzdgs 的回复:]
这句话应该是对消息的响应机制来说的。MFC中采用的是消息映射的机制,而没有用虚函数的机制,因为消息有很多,如果用虚函数机制,需要给每个消息定义一个虚函数,在分派消息时,程序需要逐一判断是哪一个消息,找到合适的分支后再调用相应的虚函数;而通常情况下,应用程序不需要响应太多的消息,消息映射方式只需要判断程序想要响应的这些消息即可,所以开销小。
[/Quote]

支持地主
yc_8301 2009-03-17
  • 打赏
  • 举报
回复
俺觉得处理上速度都差不多,但是当初MFC为什么使用 宏来实现消息映射呢,?
当时的环境造成的,当时机器的性能并没有现在好,而虚拟表本身又很占用资源,(对每个对象都会产生很多字节来处理和存储虚拟表)
最重要的是当时微软 的C++编译器技术是在很差,特别是优化不是很牛,所以选择了 微软最熟悉的纯C方式。
要不,现在.Net Framework为什么使用虚拟表来搞定消息呢!!!(有牛人呗。。)
idch99 2009-03-17
  • 打赏
  • 举报
回复
先说虚函数的运行时开销:
一次整形加法(指针偏移)和一次指针引用
每个类型一个虚表,典型情况下小于32字节
每个对象若干个(大部分情况下是一个)虚表指针,典型情况下小于8字节
虚函数是C++运行时多态特性中开销最小的,可在对性能有苛刻要求的场合,或者需要频繁调用,对性能影响较大的地方(比如每秒钟要调用上百次或更多的事件处理函数)就要考虑一下了!!

再说MFC消息映射通过宏定义实现,代码被翻译后实质是面向过程的switch—case语句,来判断识别消息,消除了对虚拟函数表的需要,减小了开销,也更快些。



ahao 2009-03-16
  • 打赏
  • 举报
回复
虚函数调用不需要逐一判断的,就需要一个虚表指针和一个偏移量,这个在编译期是可以确定的,所有还是很快的,以前不用可能是考虑到虚表的空间开销吧,因为消息太多了,每个类都有个虚表就很可观了。而且,MFC出来的时候,c++编译器实现都不是很好,机器内存也少,所以用C的方式是合理的。虽然查隐射表会有点慢。
  • 打赏
  • 举报
回复
不把消息做成虚函数在<<深入浅出MFC>>中说的挺清楚了.为了减轻系统负担.而且消息是WINDOWS特有的,C++并没有特殊的支持.所以通过宏来建立消息映射关系.实际上就是定义了一个函数指针的数组,根据不同的消息类型,选择相应的函数来处理.

而且虚函数是C++特有的.是为了实现让子类能过覆盖父类的方法,来改变行为的一种办法.用侯先生的话说,叫更有弹性.
cnzdgs 2009-03-16
  • 打赏
  • 举报
回复
这句话应该是对消息的响应机制来说的。MFC中采用的是消息映射的机制,而没有用虚函数的机制,因为消息有很多,如果用虚函数机制,需要给每个消息定义一个虚函数,在分派消息时,程序需要逐一判断是哪一个消息,找到合适的分支后再调用相应的虚函数;而通常情况下,应用程序不需要响应太多的消息,消息映射方式只需要判断程序想要响应的这些消息即可,所以开销小。
zteclx 2009-03-16
  • 打赏
  • 举报
回复
如果没有特殊需要,两者都差不多。
x8710162 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
这都是陈词滥调了,那都是10年前的话了。
[/Quote]

能解释的话,解释一下嘛!!
。。。。。那现在应该说什么?
greatws 2009-03-16
  • 打赏
  • 举报
回复
我觉得差不多,都是用偏移量去调用函数的
healer_kx 2009-03-16
  • 打赏
  • 举报
回复
这都是陈词滥调了,那都是10年前的话了。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧