《深度探索C++对象模型》笔记——Function语意学
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语意学的更多相关文章
- 【深度探索c++对象模型】Function语义学之虚函数
虚函数的一般实现模型:每一个class有一个virtual table,内含该class中的virtual function的地址,然后每个object有一个vptr,指向virtual table. ...
- 【深度探索c++对象模型】Function语义学之成员函数调用方式
非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
随机推荐
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- 【poj解题】1308
判断一个图是否是一个树,树满足一下2个条件即可:1. 边树比node数少12. 所有node的入度非0即1 节点数是0的时候,空树,合法树~ 代码如下 #include <stdio.h> ...
- The 2014 ACMICPC Asia Regional Shanghai Online
XorZip小队第一次合作,虽然结果还是有些可惜,但是状态和感觉都还不错. [A]数论+二分(-_-///) [B]Lucas定理+数位DP(-_-///) [C]LCA.LCT+树链剖分 [D]题目 ...
- javascript 中的this
he scope of all functions is window. (The reason why is you are invoking f as a function(类,全局的类) and ...
- Cocos2dx 3.1.1 将一个2.X的项目改成3.1版本
最近在论坛上下载到了一个Cocos2dx的单机跑酷例子, 也不知道是2.x版的, 花了一天时间试着把他改成3.1.1的试试, 现在已经可以顺利编译的, 但是还是有Heap Free的问题,调试了好几天 ...
- python函数的参数传递问题---传值还是传引用?
摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...
- 23、手把手教你Extjs5(二十三)模块Form的自定义的设计[2]
在本节中将要加入各种类型的字段,在加入字段的时候由于可以一行加入多个字段,因此层次结构又多了一层fieldcontainer.form里面的主要层次结构如下: form -- fieldSet -- ...
- ajax原理图解
Ajax 原理图解 摘自: http://www.nowamagic.net/ajax/ajax_PicForAjaxPrinciple.php Ajax其实已经使用很久了,但一直也没有时间正经的找本 ...
- FIFO存储器
FIFO( First In First Out)简单说就是指先进先出.由于微电子技术的飞速发展,新一代FIFO芯片容量越来越大,体积越来越小,价格越来越便宜.作为一种新型大规模集成电路,FIFO芯片 ...
- poj2528 Mayor's posters(线段树区间覆盖)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 50888 Accepted: 14737 ...