zoukankan      html  css  js  c++  java
  • 读书笔记深度探索C++对象模型Chapter4

    Chapter 4 Function语义学 The Semantics of Function

    Member的各种调用方式:

    nonstatic member functions

    nonstatic member functions会被转化为nonmember形式。

    传入this指针,function中对nonstatic data member的存取都使用this来访问。

    virtual member function

    如果normalize()virtual member function,则

    ptr-> normalize()会变成

    (*ptr->vptr[1])(ptr); //1vtbl slot的索引值,关联到normalize

    static member function

    static member function将会被转换为一般的nonmember函数调用。

    obj.norm()ptr->norm()都会变为 norm_7Point3dSFv();

    虚拟成员函数 virtual member function

    基本实现模型:每个object都有virtual table,内含该class之中所有的virtual function地址,每个object含有一个vptr指向这个vtbl

     

     vf

    为了支持virtual function机制,必须首先能够对多态对象有某种形式的“执行期类型判断法 runtime type resolution”。

    ptr->z();中需要知道ptr的确切类型。

    什么时候需要向class添加runtime type相关信息,添加什么样的信息:

    当这个类有virtual function的时候。需要一个表示class的类型的信息和指向vtbl的指针。

     一个class只有一个vtbl,其中的函数包括:自己定义的虚函数;从父类继承来的未被override的虚函数;纯虚函数;

    单一继承下的virtual function

     

     vtbl

    多重继承下的virtual function

    多重继承下涉及到this指针的调整。

    class C : public A,B...

    A *a = &abc;

    B *b = &abc;

    a或者b调用虚函数时,需要将abc转为合适的this指针。

    于是vtbl中的虚函数需要知道自己对应的this指针(Bjarne原来方法是将this指针的信息(offset)记录在vtbl中)。

    另外的解决方案是thunk技术。

    thunk是一小段assembly代码,形如

    pbase2_dtor_thunk:

       this += sizeof(base1);

       Derived::~Derived(this);

    thunk技术允许vtbl slot中只含一个指针(指向virtual function(不需要调整this指针时)或者thunk(需要调整this指针时))。

    虚继承下的virtual function

    不明白(书上没写明白: ...编译器对virtual base class的支持简直就像进了迷宫一样...不适合在此处讨论...我的建议是不要在virtual base class中声明nonstatic data members)。

    函数的效能

    指向member function的指针

    取一个nonstatic member function的地址,得到这个函数的实现在内存中的位置(当然,调用时需要一个对象)。

    使用“指向member function的指针”调用虚函数,仍能够支持虚函数机制:&Point::z();返回的不是内存地址,而是slot索引值。

    Inline Function和形参(Formal Arguaments

  • 相关阅读:
    Python脚本文件(.py)打包为可执行文件(.exe)即避免命令行中包含Python解释器
    MVC 三步完成增删改查设计
    MVC中使用SqlServerCe
    回车转Tab
    动态代码
    Mvc 用户没有登录跳转到登录界面
    Mvc
    Mvc提交
    EF查询 linq
    EF数据迁移 Migrations
  • 原文地址:https://www.cnblogs.com/apprentice89/p/2981565.html
Copyright © 2011-2022 走看看