1、member的各种调用方式

(1)nonstaticmember functions

C++的设计准则之一就是:非静态成员函数至少必须和一般的非成员函数有相同的效率,编译器内部将成员函数转换为对等的非成员函数实体。通过安插this指针和mangling等完成。

(2)namemangling(名字的特殊处理)

使名字独一无二,函数的signature为函数名称+参数个数+参数类型;

(3)virtualmember functions

通过vptr来调用。有时inline会极大地提高效率。

(4)staticmember function

注意一个问题:如果class设计staticdata member声明为nonpublic,那么必须提供一个member function 来存取该member,虽然可以不依靠classobject来存取staticmember,但存取函数必须绑定于一个classobject上。此时引入了staticmember function。

主要特性是没有this指针。注意它不能直接存取nonstatic members;不能被声明为const、volatile或virtual;不需要经由classobject才被调用(但是可以)。

对其取地址,得到的是在内存中的地址,是一个nonmember函数的指针。

2、virtual function members

(1)单一继承时

当一个类派生自另一个类,一共会有三种可能:

它可以继承base class所声明的virtualfunctions的函数体,正确的说是该函数体的地址被拷贝到derivedclass的virtualtable相对应的slot之中;

它可以使用自己的函数体,这表示它自己的函数体地址必须放在对应的slot之中;

它可以加入一个新的virtual function,此时virtualtable的尺寸会增大一个slot,新的函数体地址会被放进该slot之中。

(2)多重继承时

一个derivedclass内含n-1个额外的virtualtable(n表示上一层baseclasses的个数),一个主要的与最左端的base class共享,其他的依次与其他base class的有关。

(3)虚拟继承时

建议不要在virtualbase class中声明nonstaticdata members。

3、指向member function的指针

(1)复习成员函数指针:

指向类的非静态成员指针在声明时必须指明classobject;

double(Point::*pmf)();//声明,指出返回值类型,类名称,参数列表

double(Point::*cord)() = &Point::x; //初始化,赋值通过&取地址

(2)支持“指向virtualmember functions”的指针

虚拟机制仍然能够在使用“指向memberfunction之指针”的情况下运行;对一个virtualmember function取地址,所得到的是其在virtualtable的索引值。

对于如何区分内存地址还是vtbl的索引?采用一种基于假设继承体系中最多只有128个virtualfunctions的方法。(即首位是1还是0)

(3)多重继承之下,指向member functions的指针

对于通过memberfunctions指针来调用的操作,需要导入一个vcall thunk。函数指针地址要么是真正的member function地址(nonvirtual时),要么是vcallthunk的地址。vcall thunk会选出并调用相关vtbl中适当的slot。

4、Inline Functions

(1)用inline来完成set和get操作很高效。

(2)inline实现中,对于面对会带来副作用的实际参数,编译器通常会引入临时对象;如果实际参数是一个常量表达式,会在替换之前先进行求值操作,后续的inline时直接将常量绑定;如果不是上述两点就直接替换。

(3)如果inline函数中有许多局部变量,则会产生巨多临时对象,这影响效率,要注意。

《深度探索C++对象模型》--4 Function语意学相关推荐

  1. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  2. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

  3. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  4. 深度探索C++对象模型第2章 构造函数语义学

    默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...

  5. [读书笔记]《深度探索C++对象模型》

    文章目录 前言 思维导图 第一章 关于对象 第二章 构造函数语意学 构造函数 拷贝构造函数 初始化列表 第三章 Data 语意学 第四章 Function 语意学 非静态成员函数 静态成员函数 虚成员 ...

  6. 深度探索C++ 对象模型(7)-Data member的布局(虚继承)

    虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...

  7. 深度探索C++ 对象模型(6)-Data member的绑定

    防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...

  8. 深度探索C++ 对象模型(5)-Initialization list(3)

    四点: 1.list中的项目次序是由class中的members声明次序决定,不是由initialization list中的的代码决定 如下代码有一个陷阱,i值为一个不可预知未初始化的值.原因是按照 ...

  9. 深度探索C++ 对象模型(4)-Default Copy Constructor(3)

    程序转化语意学 1. 显式初始化 原代码为: X x0; void foo_bar() { X x1(x0);X x2 = x0; X x3 = X(x0);} 编译器将产生拷贝构造函数,调用拷贝构造 ...

  10. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

最新文章

  1. Nginx+Lua服务端合并静态文件
  2. mysql 免安装重装_MYSQL的免安装的重装
  3. php nginx exec kill,彻底杀死nginx并重启
  4. 一、Delphi 2009 中的泛型
  5. SDH光端机概述与技术应用详解
  6. 在Ubuntu下创建hadoop组和hadoop用户
  7. 计算机硬件知识pdf,计算机硬件知识 (很详细)
  8. 树莓派使用无线网卡上网相关命令
  9. 关于钱学森定义复杂网络一事的探究
  10. 分享一波恋爱社交APP源码,真好~
  11. slk文件转换器安卓版_MP3提取转换器
  12. 计算机学院手绘,PS电脑手绘效果绘画教程
  13. google谷歌广告投放被拒登 提示有恶意垃圾软件
  14. 「AR裸眼插画」零基础入门级教程来啦
  15. HTML表格竖边框线,Table表格横竖线实现Css
  16. mtk智能机平台LCM,CTP的ESD防护处理
  17. C++ STL容器 map禁止自动排序
  18. ISO 8601 标准时间格式
  19. selenium 页面加载超时处理
  20. PYTHON练习题---设有一头小母牛,从出生第四年起每年生一头小母牛

热门文章

  1. 可视化-echarts流向图制作及recharts
  2. flink dataset api使用及原理
  3. 阅读源代码的一点小技巧
  4. fastjson读取json配置文件
  5. spring源码分析之context:component-scan/vsannotation-config/
  6. spring beans源码解读之--总结篇
  7. 机器学习Sklearn实战——决策树算法
  8. vue-element-admin台前端解决方案: 基于 vue 和 element-ui实现
  9. 数据科学教程:R语言与DataFrame[2016版]
  10. CSDN蒋涛大数据表明:DCO - 区块链时代企业级服务的全新机会