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. 【HighCharts系列教程】五、版权属性——Credits

    一.Credits属性说明 严格来讲,Credits并不算版权信息,官方的说法是:Highchart by default putsa credits label in the lower right ...

  2. Jobject 使用

    obj2 = JObject.Parse(result.Html); JArray _Jarr = _obj["data"]["siteList"].Value ...

  3. PHP学习笔记--1,不总结,不掌握,不明白!

    不总结,不掌握,不明白! 前言: 学php一开始就是语法,变量,数组,函数,OOP(面向对象[封装,继承,多态,抽象]) 这些都是最基础的东西,但你还要懂一些在实际开发中要用的东西,比如基本的HTML ...

  4. Oracle教程-安装、结构(一)

    本文安装的是Oracle中的11G版本 一. 将文件win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压. 注意:这两个文件解压到 ...

  5. [Unity Shader]光照模型对物体的假设

    什么是光照模型 光照模型就是模拟光在物体间的传递过程,以确保物体可见表面每一点的亮度和颜色. 当光照射到一个物体表面时,光可能被吸收.反射或折射.反射和折射的光使物体可见.如果入射光全部被吸收,物体将 ...

  6. 在Android studio环境下使用EventBus

    EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 ...

  7. 《算法导论》2.3-7 检查集合中是否存在两数字和为指定的X--算法和证明

    习题2.3-7:设计一个算法,对于一个给定的包含n个整数的集合S和另一个给定的整数X,该算法可以在时间内确定S中是否存在两个元素,使得它们的和恰为X. 解题思路:首先应该想到的是先用一个的排序算法对S ...

  8. POJ 1862 Stripies

    每次合并最大的两个,优先级队列维护一下. 输出的时候%.3lf G++会WA,C++能AC,改成%.3f,都能AC. #include<cstdio> #include<cstrin ...

  9. FZU 1064 教授的测试

    递归构造答案. 根据当前整颗树的编号,可以计算左右子树有几个节点以及编号.因此,不断dfs下去就可以了. #include<cstdio> #include<cstring> ...

  10. ORACLE odbc驱动相关

    驱动下载 http://www.oracle.com/technetwork/topics/winsoft-085727.html http://www.oracle.com/technetwork/ ...