zoukankan      html  css  js  c++  java
  • C++虚函数的缺陷

    MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数内存开销太大。在Qt中也没有采用C++中的虚函数机制,原因与此相同,其实这里还有更深层次上的原因,大体说来,多态的底层实现机制只有两种:
    1. 一种是按照名称查表
    2. 一种是按照位置查表
    两种方式各有利弊,而C++的虚函数机制无条件的采用了后者,导致的问题就是在子类很少覆盖基类函数实现的时候内存开销太大,再加上象界面编程这样子类众多的情况(大概是都不覆盖),基本上C++的虚函数机制就废掉了,于是各家库的编写者就只好自谋生路了,说到底,这确实是C++语言本身的缺陷。

    参考:http://blog.csdn.net/oowgsoo/article/details/1529411
    ----------------------------------------------------------------------------------
    感叹一句,还真的是自谋生路啊,而且是不约而同的,Delphi就采用了dynamic机制,以减小子类的内存开销,而且大多数是不必要的虚函数开销。

    在这些方法里:
    1. VC++使用一组结构体的宏定义来实现消息映射,从而解决虚函数的缺陷。
    2. Qt的信号槽机制其实就是按照名称查表。
    3. Delphi则通过dynamic机制从编译器的角度来解决这个问题。这些方法里,自然是Delphi的方法最简洁方便,因为没有多余的宏,没有生成的临时代码。

    ----------------------------------------------------------------------------------
    以前一直不明白为什么说Delphi语法优美,现在有2点体会,好像是这么回事:
    1. C++的宏定义表面上是个好东西,也确实是个好东西,因为可以做无穷无尽的扩展(QT就是一个典型的例子),但用它就会把源代码搞的很复杂,你完全都不知道编译器/类库会把你的源代码替换成什么东西。VC++也是靠这套方法实现消息机制的,QT更夸张,每个文件都要生成moc文件才能真正进行编译。而Delphi的源代码就是源代码,对所有人/所有库都平等,没有什么隐晦的代码。
    2. Delphi的编译器做了很多事情,Delphi的库也提前把许多事情都做好了(比如TPageControl如果要在VC++和QT中实现,使用起来烦不胜烦,谁用谁知道),使之手敲的代码看起来尽可能的少。

  • 相关阅读:
    Pro/Toolkit示例之一:异步启动ProE
    Formatted MessageBox/AfxMessageBox
    Pro/Toolkit示例之二:同步Dll程式
    模拟按钮控件BN_CLICKED消息事件
    详解ProToolkit注册文件
    C++函数指针
    Message Basic
    C++指针之间的赋值与转换规则总结
    CString&CStringA&CStringW之间的相互转换
    Devexpress组件之XtraBars.PopupMenu的使用
  • 原文地址:https://www.cnblogs.com/findumars/p/4021383.html
Copyright © 2011-2022 走看看