深度探索C++对象模型第四章 Data 语意学

原创 2002年07月01日 14:21:00

4.1 Member的各种调用方式
   Nonstatic Member Functions : 速度和一般的Nonmember function 有相同的效率。 编译器会对nonstatic member function进行改造。加入this参数,改变函数内部的对member data 的使用方法,改变函数的名字--相当于nonmember function . 这里面有一个函数名字的处理问题,加入class name!
   Virtual Member Funciton : 通过一个object 调用虚拟函数,这时需要通过vptr中转一次,而如果直接通过class::function,则不回缠上不必要的决议操作。而使用classs scope operator明确的调用某个virtual funciton 其决议方式和nonstatic member funciton 一致。
   Static Member Funciton : static member function 的主要特性就是没有this指针,所以他不能够直接存取其class的nonstatic data members ; 也不能够被声明为virtual ,const, volatile ; 他因此也就不需要经由某个class object 才能够被调用。他的调用速度和nonmember funciton 差不多。如果取static member function的地址,那么江会是直接“Nonmember函数指针”,而不是“指向class member funciton的指针”。

4.2 Virtual Member Function

多重继承下的Virtual Funciton :
当使用base  class pointer 调用virtual function的时候,可能出现两种情况。因为该base class pointer可能指向的位置处于derived class object的开始处,也可能有一个偏移量。一般规则时,经由指向“第二或后继之base class”的志真来调用derived class virtual funciton ,改掉用操作所连带的“必要的this指针调整”操作,必须在执行期完成。
那么怎么处理呢? 可能本来不需要调整的也变得要调整了! 真是讨厌!  嘿嘿!  thunk技术北引用到了编译器中!  怎么解决呢? 
Sun编译器的方法是提供所谓的“split functions”技术;以相同的算法产生两个函数,其中第二个在返回之前,为指针加上必要的offset,于是不论通过base1或者derived指针调用函数,都不要调整返回值;而如果通过base2指针调用,则是另外一个函数 。
IBM的方法呢?"把thunk搂抱在真正被调用的virtual function中。函数移开实现(1)调整this指针,然后才(2)执行程序员写的函数码;至于不需要调整的函数调用操作,就直接进入(2)部分"!
MS的方法以所谓的'address points'来取代thunk策略,即将用来改写别人的函数(也就是overriding function)期待获得的是'引入virtual之class'的地址。这就是'address point'

4.4  指向Member Function的指针
指向 nonstatic member function 指针 :取一个nonstatic member function 的地址,如果该函数是nonvirtual ,则得到的结果是他在内存中的真正的地址。然而这个值也是不完全的,需要帮盯在某个class object的地址上,才能够通过它调用该函数。所有的nonstatic member functions 都需要对象的地址(以this参数指出)。
指向 static member functions 指针 :而static member functions的指针则是函数指针,而不是指向member function 的指针。
指向 virtual member functions 指针:对一个virtual member funciton 取地址,所能够获得的只是一个索引值。编译器在评估求值的时候,会(*ptr->vptr[(int)pmf])(ptr) !

【C++】深度探索C++对象模型之执行期语意学

执行期语意学,即在程序执行时,编译器产生而外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行。 一、对象的构造和析构 对于类对象的构造,我们应该尽量在需要使用时才进行...
  • zone_programming
  • zone_programming
  • 2015年12月27日 11:10
  • 525

《深度探索C++对象模型》--2 构造函数语意学

上一篇: 《深度探索C++对象模型》--1 关于对象 1、default constructor的构造操作    C++standard:对于class X ,如果没有任何user-decla...
  • KUAILE123
  • KUAILE123
  • 2014年02月17日 20:40
  • 673

《深度探索C++对象模型》第六章 执行期语意学

new运算符和delete运算符 运算符new看似是一个简单的运算,比如:int *pi=new int(5);但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内...
  • m0_37316917
  • m0_37316917
  • 2017年03月11日 12:28
  • 156

深度探索C++对象模型-构造函数语义学

default constructor构建 default constructors在编译器需要的时候产生,区别于程序设计者的需要。以下程序进行说明: class A(public: int v;);...
  • isunn
  • isunn
  • 2015年04月19日 17:29
  • 876

《深度探索c++对象模型》学习笔记

1、c++的布局和存取时间成本?封装并未给c++带来任何的空间或执行期的不良后果,c++在布局和存取时间上的主要额外负担由虚拟化引起。包括: 1)virtual function机制。用以支持一个有...
  • will130
  • will130
  • 2016年05月31日 15:48
  • 270

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 636

深度探索c++对象模型(一)_关于对象

原博客地址:http://www.roading.org//develop/cpp/c对象面面观.html 学习C++应该看过不少关于C与C++的口水贴,以及关于各种对比C与C++效率比较的...
  • A_IIIIIIIII_A
  • A_IIIIIIIII_A
  • 2016年01月04日 11:31
  • 567

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

本文以下内容为深度探索c++对象模型的笔记 深度探索c++对象模型是Stanley B Lippman的著作,对c++进行了较深层次的探讨。于我而言,这本书解答了我多年(半年)的疑惑: 虚函数是怎...
  • cover_s
  • cover_s
  • 2016年08月30日 15:51
  • 589

C++对象模型简介(二)——《深度探索C++对象模型》精简笔记

叁 多重继承 class A { public: A() {} virtual ~A() {} virtual int foo( ) { return val ...
  • yang_yulei
  • yang_yulei
  • 2013年03月30日 23:48
  • 12125

《深度探索C++对象模型》第四章 Function语意学

member function相对于nonmember function之间不存在效率之间的差别,因为编译器内部已经将“member 函数实体”转化为对等的“nonmember 函数实体”,转化过程:...
  • m0_37316917
  • m0_37316917
  • 2017年03月11日 00:07
  • 142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度探索C++对象模型第四章 Data 语意学
举报原因:
原因补充:

(最多只允许输入30个字)