发布新日志

  • [转]C++如何实现虚函数的动态联编

    2007-06-23 20:38:29

        编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型[1]中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。

        我所说的“标准”方式,也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写,针对1.1中的例子:

    void bar(A * a)
    {
        a->foo();
    }

    会被改写为:

    void bar(A * a)
    {
        (a->vptr[1])();
    }

        因为派生类和基类的foo()函数具有相同的VTABLE索引,而他们的vptr又指向不同的VTABLE,因此通过这样的方法可以在运行时刻决定调用哪个foo()函数。

        虽然实际情况远非这么简单,但是基本原理大致如此。
  • [转]C++]static/全局变量、函数等

    2007-06-21 15:17:11

    http://blog.csdn.net/duckur/archive/2005/11/05/523545.aspx



    static Global variable: 文件作用域:只在声明的文件中有效,其他源文件中不可见;同时有了static的生命周期
    Global variable:文件作用域:可以加上extern 声明为外部变量,跨文件作用域

    static (Global) Function: 有文件作用域,只在本文件中使用
    Global Function:无文件作用域

    static Member (in Function) variable:函数调用完成后,变量保存状态,再次调用函数,不会重新分配空间
    Member(in Funcition) variable:函数内的生命周期

    static Member(in Class) variable: 属于类范围,
    Member(in Class) variable:属于类派生的特定对象,生命周期和对象一致

Open Toolbar