【深度探索c++对象模型】Function语义学之成员函数调用方式
非静态成员函数
c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率。编译器内部已将member函数实体转换为对等的nonmember函数实体。
转化步骤:
1.改写函数原型以安插一个额外的参数到member function中,使class object可以调用该函数,该额外参数为this指针。
2.将函数中每一个对nonstatic data member的存取操作改为经由this指针来存取
3.对函数名称进行处理,使它在程序中成为独一无二的词汇。
名称的特殊处理
一般而言,member的名称前面会由编译器加上class名称,形成独一无二的命名。
class bar
{
public:
int ival;
};
编译后ival可能会变成ival_bar.之所以如此处理,是为了防止以下的操作:
class foo:public bar
{
public:
int ival;
};
这样编译后会变成这样:
class foo
{
public:
int ival_bar;
int ival_foo;
};
由于member function可以被重载化,所以需要更广泛的mangling手法,以提供独一无二的名称。编译器利用函数名称、参数个数、参数类型来使得函数有着独一无二的名称。这样一来,可以捕捉链接时期函数名称+参数数目+参数类型方面的错误,但是如果返回类型出错,就没办法检查出来。
virtual member function(虚函数)
point3d obj;
point3d *ptr = &obj;
若normalize()是虚函数,则ptr->normalize()将会被内部转化为(*ptr->vptr[1])(ptr)
其中,vptr表示由编译器产生的指针,指向virtual table,它被安插在每一个声明有(或继承自)一个或多个virtual function的class object中。
1是virtual table slot的索引值,关联到normalize()函数,第二个ptr表示this指针。
注意:经由一个class object调用virtual function,这种操作总是被编译器像对待一般的nonstatic member function一样加以决议,也就是不会用到虚指针。
静态成员函数
在引入静态成员函数之前,c++要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当一个或多个非静态数据成员在成员函数中被直接存取时,才需要类对象。类对象提供了this指针给这种形式的函数调用使用。这个this指针把在成员函数中存取的非静态类成员绑定于对象内对应的成员之上。如果没有任何一个成员被直接存取,事实上就不需要this指针,因此也就没有必要通过一个类对象来调用一个成员函数。
独立于类对象之外的存取操作,在某个时候特别重要:当class设计者希望支持没有class object存在的情况。程序层面上的解决方法是把0强制转换为一个类指针,因而提供了一个this指针实例,语言层面上的解决方法是静态成员函数。
静态成员函数的主要特性是没有this指针,以下次要特性统统根源于主要特性:
1.它不能够直接存取所在类中的nonstatic members(需要this指针)
2.它不能够被声明为const volatile或virtual(因为虚函数通过vptr调用,而vptr属于对象,但是静态成员函数属于类)
3.可以通过类名或class object来调用
【深度探索c++对象模型】Function语义学之成员函数调用方式的更多相关文章
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 拾遗与填坑《深度探索C++对象模型》3.2节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
随机推荐
- 摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用
摄像头调用代码 笔记本的话,本身有一个摄像头,由于用的usb摄像头,需要把笔记本的摄像头禁用后,再使用 <!DOCTYPE html> <html lang="en&quo ...
- 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...
- 转--C#编程总结
C#编程总结--总目录 http://www.cnblogs.com/yank/p/3543423.html
- Openjudge-4151-电影节
这个题是一道贪心的题目,我们要想看的电影数目最多,我们肯定每次都要选最早结束的电影,这样我们才能去看下一部电影. 它本身最早结束,如果同时开始,那肯定是它的放映时间比较短,如果它后开始,先结束,那它的 ...
- [LOJ] 分块九题 6
单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...
- cobbler 无人值守-介绍
cobbler 介绍 快速网络安装linux操作系统的服务,支持众多的Linux版本,也支持网络安装windows系统 PXE的二次封装,将多种安装参数封装到一个菜单 它是由Python编写的 还可以 ...
- Go:json(序列化、反序列化)
一.示例 package main import ( "encoding/json" "fmt" ) type Person struct { Name str ...
- MyISAM和InnoDB索引实现对比
MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.如图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引 ...
- Fidder详解-工具简介(保存会话、decode解码、Repaly、自定义会话框、隐藏会话、会话排序)
前言 本文会对Fidder这款工具的一些重要功能,进行详细讲解,带大家进入Fidder的世界,本文会让你明白,Fidder不仅是一个抓包分析工具,也是一个请求发送工具,更加可以当作为Mock Serv ...
- 大数据学习——securecrt同时向多个tab窗口发送相同的命令
右键选中 然后在下面空白窗口写命令就可以了