member的各种调用方式

  • C++支持三种类型的member functions:static、nonstatic和virtual。
  • nonstatic member functions会被编译器转换为对等的nonmember function。安插一个额外的参数this指针以改写函数的signature,对nonstatic data member的存取操作改为由this指针来存取,函数名称经过mangling处理(考虑class名称和参数)成后成为一个外部函数。
  • virtual member function经由指针(或引用)调用时将被转换为类似(*ptr->vptr[1])(ptr)这种形式,经由一个class object调用时将被像对待一般nonstatic member function一样地加以决议。
  • static member function会被提出于class声明之外,并给予一个经过mangled的适当的名称,以对象、引用或指针调用static member function将被转换为一般的nonmember函数调用。

虚拟成员函数

  • 为了支持virtual function机制,必须首先能够对于多态对象有某种形式的“执行期类型判断法”,需要一份执行期相关信息。
  • 何时才需要这份信息?多态(polymorphism)表示“以一个public base class的指针(或reference),寻址出一个derived calss object”的意思。消极多态可以在编译期完成,积极多态需要额外的执行期信息。
  • 什么样的额外信息我们需要存储起来?我们需要知道:1)指针或引用所指对象的真实类型,2)以及被调用实例的位置。
  • 如何实现?1)一个字符串或数字表示所指对象的真实类型,2)一个指针,指向某表格,表格中持有程序的virtual functions的执行期地址,即被调用实例的位置,3)每一个virtual function被指派一个表格索引值。这些都是在编译期完成的。
  • 如何有足够的知识在编译时期设定virtual function的调用呢?1)虽然通过指针(或引用)调用某虚函数时,我们并不知道该指针(或引用)所指对象的真正类型,但是我们知道,经由该指针(或引用)可以存取到该对象的virtual table,2)虽然我们不知道继承体系中具体哪一个虚函数实例会被调用,但是我们知道被调用的虚函数的地址确实都被放在对应的一个表格中。
  • 在多重继承中支持virtual functions,经由第二个或后继的base class指针(或reference)调用derived class virturl function,其所连带的必要的this指针调整操作,必须在执行期完成。

指向member function的指针

  • 取一个nonstatic member function的地址得到的将是它在内存中的地址,类型是一个指向member funtction的指针。
  • 取一个static member function的地址得到的将是它在内存的地址,类型是一个指向nonmember function的指针。
  • 取一个virtual member function的地址得到的将是它在与其相关之virtual table中的索引值。

inline functions

  • 形式参数有三种情况,常量表达式在替换之前完成求值,非常量表达式无副作用直接替换之,有副作用的参数需要导入一个临时性变量避免重复求值。
  • 局部变量都必须被放在函数调用的一个封闭区段中,拥有一个独一无二的名称。
  • inline函数中的局部变量,再加上有副作用的参数,可能会导致大量的临时性对象产生。

《深度探索C++对象模型》笔记——Function语意学的更多相关文章

  1. 【深度探索c++对象模型】Function语义学之虚函数

    虚函数的一般实现模型:每一个class有一个virtual table,内含该class中的virtual function的地址,然后每个object有一个vptr,指向virtual table. ...

  2. 【深度探索c++对象模型】Function语义学之成员函数调用方式

    非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...

  3. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  4. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  5. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  6. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  7. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  8. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  9. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  10. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

随机推荐

  1. Monkey and Banana(基础DP)

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. Bundle versions string, short与Bundle version

    在提交更新的app至appstore中时,需要在**.plist中设置app的version信息.Bundle versions string, short --- CFBundleShortVers ...

  3. PAT (Advanced Level) 1082. Read Number in Chinese (25)

    模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  4. Quick Cocos2dx Action相关

    周末在家除了看犯罪心里和反恐24小时,啥都没干,为毛在家老是不能安安静静的看书学习敲代码?不知道啊 心好累,感觉学习不下去了. 然后公司上午有半天世界杯决赛假,下午回来更新了svn,没啥工作内容,只好 ...

  5. Java笔记(二)

    10.   public protected default private 同一个类中 √ √ √ √ 同一个包中 √ √ √   子类 √ √     不同包中 √       11. 线程: s ...

  6. Openlayers修改矢量要素

    将以下代码放到demo下examples中即可运行 <!DOCTYPE html><html> <head> <meta http-equiv="C ...

  7. Java的JDBC事务详解

    Java的JDBC事务详解         分类:             Hibernate              2010-06-02 10:04     12298人阅读     评论(9) ...

  8. tt程序分析(一)

    首先是loginactivity login成功以后,跳转到mainActivity. mainActivity中有四个fragment , 聊天        fragment_chat 通讯录   ...

  9. DIV 和 SPAN 区别

    DIV 和 SPAN 元素最大的特点是默认都没有对元素内的对象进行任何格式化渲染.主要用于应用样式表(共同点). 两者最明显的区别在于DIV是块元素,而SPAN是行内元素(也译作内嵌元素). 详解:1 ...

  10. poj1328贪心中的区间问题

    题意:给定海岛个数.雷达半径以及各海岛坐标,求能覆盖所有海岛的最小雷达数. 思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间.然后对区间排序,定义一个最右点over,依次延伸ove ...