关于MFC消息映射表与虚函数的效率问题
深入浅出MFC对于虚函数实现方式的缺点,它指出:虚函数耗费大量内存,系统最终将被这些额外负担拖垮。
但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?
书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?
我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte。如果CCmdTarget中定义100个消息,那其中虚函数表字段大约要占用400字节的内存。
然后我数了下,MFC中派生自CCmdTarget的类总共有100个,那么这么多类的虚函数表总共需要占用多少个字节呢?
400Byte*100个=40KB字节。
然后加上 程序员自己派生的类和消息 所多占的函数指针项,我想也应该不会超过40KB这个基础内存空间的10倍吧?也就是不超过400KB字节的内存。
然而现在动辄几G的内存,这点消耗大概应该可以忽略不计吧?
所以,我的问题是,如果如书上所说,虚函数的实现方案增加了太多的额外负担,那我以上的计算方法哪里出错了?
如果我的上述讨论方法正确的话,那是否能说明书上的说法已经过时,而利用虚函数的实现方法,用空间换取执行效率上的提高可行呢?
但是现在对于容量巨大的白菜价格的内存来说,这种额外负担是否已经过时了呢~?
书中提到,虚函数表中的每一个项目都是一个函数指针,价值4字节,如果基类的虚函数表有100项 (MFC里面的消息数量是否在这个数量级?),经过十层继承,开支散叶,总共需要耗费多少内存?
我粗略地算了下,不知道这种计算方法是否正确,4Byte*100项=400Byte。如果CCmdTarget中定义100个消息,那其中虚函数表字段大约要占用400字节的内存。
然后我数了下,MFC中派生自CCmdTarget的类总共有100个,那么这么多类的虚函数表总共需要占用多少个字节呢?
400Byte*100个=40KB字节。
然后加上 程序员自己派生的类和消息 所多占的函数指针项,我想也应该不会超过40KB这个基础内存空间的10倍吧?也就是不超过400KB字节的内存。
然而现在动辄几G的内存,这点消耗大概应该可以忽略不计吧?
所以,我的问题是,如果如书上所说,虚函数的实现方案增加了太多的额外负担,那我以上的计算方法哪里出错了?
如果我的上述讨论方法正确的话,那是否能说明书上的说法已经过时,而利用虚函数的实现方法,用空间换取执行效率上的提高可行呢?
...全文
相关推荐
mfc的具体介绍
消息映射表关联了消息和处理函数,当窗口接收到消息时,会查找对应的消息映射并调用处理程序。这种方式避免了大量虚函数表的使用,节省了内存并提高了效率。
手把手教你 MFC教程
#### 四、消息映射与对象创建- **消息映射**:MFC使用消息映射机制来处理窗口消息,通过消息映射表将特定的消息关联到类的成员函数上。
个人觉得蛮好的MFC教程
每个MFC类都可以有自己的消息映射表,将特定的消息与相应的成员函数关联起来,而不是通过大量的虚函数实现,这极大地提高了效率并降低了内存消耗。3.
MFC教程知识全集2.pdf
- **4.5.2 应用程序的Run函数**:`Run`函数是MFC应用程序的主循环函数,负责处理消息队列中的消息。 - **4.5.3 消息映射表**:用于关联特定的消息和相应的处理函数。
MFC子窗口与父窗口之间消息的传递
**消息映射(Message Mapping)** 在MFC中,消息映射是将消息与处理函数关联起来的过程。每个窗口类(CWnd派生类)都有一个消息映射表,定义了该类能够处理的消息和相应的处理函数。


