【深度探索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++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
随机推荐
- tomcat https协议
一.tomcat证书 JDK自带的keytool工具来生成证书 1. 在jdk的安装目录\bin\keytool.exe下打开keytool.exe 2. 在命令行中输入以下命令: keytool - ...
- Linux常用的操作指令
1.pwd-显示当前所在位置 2.cd-进入当前目录 3.cd..-返回上一级目录 4..ls命令参数选项有很多,ls也是经常使用到的命令.如果不清楚命令的使用方式可以直接 ls --help来查看 ...
- IoC简介
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来降低程序代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Injecti ...
- isEqual ,判断两个对象或变量是否相等
function isEqual(a, b) { //如果a和b本来就全等 if (a === b) { //判断是否为0和-0 return a !== 0 || 1 / a === 1 / b; ...
- 暑假集训 || 概率DP
Codeforces 148D 考虑状态转移..https://www.cnblogs.com/kuangbin/archive/2012/10/04/2711184.html题意:原来袋子里有w只白 ...
- 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use: JVM_Bind
在使用SpringMVC测试的时候, 遇到了这样一个问题, 说的是端口已经被使用了. 代理抛出异常错误: java.rmi.server.ExportException: Port already i ...
- TP框架中同时使用“or”和“and”
今天在tp中遇到一个问题,可能这并不算难的问题,但是我还是分享一下 以下是tp手册里面查询or的方式 $User = M("User"); // 实例化User对象 $where[ ...
- 第一章:systemverilog简介
1.为何要学systemverilog ..... 2.systemverilog起源 ..... 3.systemverilog标准历程 systemverilog3.0 for 综合 system ...
- Chrome浏览器 v68.0.3440.106 正式版怎么样?
谷歌浏览器Google Chrome稳定版迎来v68正式版第三个维护版本发布,详细版本号为v68.0.3440.106,上一个正式版v68.0.3440.84发布于8月1日,时隔8天Google又发布 ...
- SpringBoot log4j2 异常
log4j 配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...