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. CSS中margin和position:relative的定位问题

    一.代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  2. 百度网盘API的操作--PCS 百度个人云存储 上传 ,下载文件

    来自http://blog.csdn.net/u014492257/article/details/39856403 另外需要所有API使用方法的请访问本人上传的资源(需要3个下载分的)链接: htt ...

  3. windows下强大的wmic命令行工具

    windows最令网管诟病的地方就是命令行没有unix和linux强大.但这种情况正在不断改观,windows命令行也越来越强大了.其中,微软耗费大量精力打造的wmi就是一例.  获得进程ID与进程名 ...

  4. <c:foreach> 标签怎么获取循环次数?

    <c:forEach var="i" begin="1" end="9" varStatus="status"&g ...

  5. 如何创建一个要素数据类 IField,IFieldEdit,IFields,IFieldsEditI,GeometryDef,IGeometryDefEdit接口

    如何创建一个要素数据类 创建要素类用到了IFeatureWorkspace.CreateFeatureClass方法,在这个方法中有众多的参数,为了满足这些参数,我们要学习和了解下面的接口. IFie ...

  6. 【poj解题】3663

    排序, 遍历,需要裁减 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX ...

  7. <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

    Asp.net Mvc 未能加载类型“System.Web.Mvc.ViewPage 的解決方法 2010-11-30 17:31:51|  分类: .net mvc |举报 |字号 订阅   如果多 ...

  8. 关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应

    相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用. 自定义TabB ...

  9. Centos rsync文件同步配置

    一.服务器端配置: # yum -y install xinetd   CentOS默认已经安装了rsync 服务.. 输入 rsync 命令可查看是否安装.   # vi /etc/xinetd.d ...

  10. Mysql安装脚本

    Mysql PS:要先看懂脚本在复制粘贴运行脚本,每个人的环境不一样 #/bin/bash #--------变量 #num=` + ` now_lujing=`pwd` #------------- ...