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

  • 相关阅读:
    循环神经网络
    相似度计算(余弦距离/欧式距离)
    最常见Linux操作
    注意力机制总结
    随机打乱数组算法、蓄水池算法
    6.1 数据结构---树(遍历)
    Node.js调用C/C++
    linux中nmcli命令详解
    stylus入门使用方法
    webpack CommonsChunkPlugin详细教程
  • 原文地址:https://www.cnblogs.com/apprentice89/p/2981565.html
Copyright © 2011-2022 走看看