Function语义学之member function
之前我们讲过编译器会对 nonmember functions 进行怎样的扩充和该写,今天我们来讲一下 member functions 函数调用方式
一、Nonstatic Member Functions(非静态成员函数)
C++的设计准则之一就是:nonstatic member function 至少必须和 nonmember function 有相同的效率。也就是说如果们要在以下两个函数之间选择:
float member_fun( const classA *_this){...};
float classA::member_fun() const{...};
那么选择 member function 不应该带来什么额外负担,因为编译器内部已经将“member 函数实体”转换为对等的“nonmember函数实体”,假设 member_fun()函数是这样:
float member_fun( const classA *_this){ return sqrt(_this->x*_this->x+_this->y*_this->y+_this->z*_this->z);} ,咋看这个函数大家可能觉得没什么效率,因为它不能直接对 class 的成员进行操作。而 member functions 却可以。然而,member functions 要经过如下步骤转化为 nonmember function
1.改写函数原型以安插一个额外的参数到 member function 中,用以提供一个存取管道,使class object 得意调用该函数,该额外参数被成为 this 指针。
float classA::member_fun() const;被转化为 float ClassA::member_fun(const classA *const this);non-const member function 会转化为 float ClassA::member_fun(classA *const this);
2.将每一个对 class nonstatic data member 的存取操作,改为经由 this 指针来存取:
{
return sqrt(
this->x*this->x+
this->y*this->y+
this->z*this->z
)
}
3.将 member function 重新写成一个外部函数,对函数名称进行 mangling 处理,使它在程序中成为独一无二的词汇。
函数转化好以后,所有的调用操作都要转换:classa.member_fun(); 会被转化为(假设这里的member_fun 被 mangling 为 member_fun_classAFv) member_fun_classAFV( &classa );
这样,一个 nonstatic member function 就被转化为 一个 member function 了,其他的函数体内优化都会类似于之前讲的普通函数优化相同了!
二、Virtual Member Function(虚拟成员函数)
我们知道如果一个 virtual member function 是通过 class object 调用是没有多态性的,会当做一般的 nonstatic member function 函数进行处理。只有通过指针或者引用才有多态性。那么多态如何实现呢?
ptr->virtual_member_fun();
会被内部转化为 (*ptr->vptr[1])( ptr );
1. vptr 表示编译器产生的指针,指向 virtual table ,他被安插在每一个“声明有(或继承自)一个或多个 virtual function” 的 class object 中。事实上其名称会被 mangled,因为在一个复杂的 class 派生类体系中有可能存在有多个 vptrs。
2.1 是 virtual table slot 的索引值。关联到 virtual_member_fun() 函数。
3.第二个 ptr 是 this 指针---同一般的nonstatic member function。
三、Static member functions(静态成员函数)
静态成员函数由于是独立于 class 的,在调用时不能再像以上两种函数那样安插一个 this 指针。这样,static member functiongs 就有了如下特性:
1.它不能直接存取其 class 中的 nonstatic members。
2.他不能够被声明为 const、volatile 或者 virtual。
3.它不需要经由 class object 才被调用---虽然大部分时候他是这样被调用的!
一个 static member function 会被提到 class 声明之外,并进行 mangled 处理,这样就可以与其他的静态成员变量区别开来(所有的静态成员都是放在一个静态内存内)。
Function语义学之member function的更多相关文章
- Thinkphp---------Call to a member function free_result() on a non-object
1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call t ...
- :( Call to a member function Table() on a non-object 错误位置
:( Call to a member function Table() on a non-object 错误位置 $Model不是模板,是你自己先前链接数据库返回的对象...我的是改为$Form
- Fatal error: Call to a member function bind_param() on a non-object in
今天在练习 mysql是出现错误: Fatal error: Call to a member function bind_param() on a non-object in 解决步骤: 1. ...
- ECmall错误:Call to a member function get_users_count() on a non-object
问题描述: 在后台添加了一个app报错:Call to a member function get_users_count()Fatal error: Call to a member functio ...
- magento后台 Fatal error: Call to a member function getId() on a non-object in错误
后台分类管理出现错误 Fatal error: Call to a member function getId() on a non-object in 在数据库中运行以下sql语句 INSERT I ...
- Timer.4 - Using a member function as a handler
In this tutorial we will see how to use a class member function as a callback handler. The program s ...
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...
- About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。
If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...
- About Why Inline Member Function Should Defined in The Header File
About why inline member function should defined in the header file. It is legal to specify inline on ...
随机推荐
- 利用 Lua 实现 App 动态化方案
因为动态化的东西我第一次看实现方案的源码,而且目前还是大三的学生,缺少很多实践经验说错的地方还请原谅,也希望能指出,被告知.想了很久还是决定写出来,求大神勿喷. 并且我的一个朋友bestswifter ...
- 好用的log
Log.getStackTraceString(new Throwable())
- git subproject commit xxxxxxxxxxxxxxxxxxxxx -dirty
-Subproject commit 8c75e65b647238febd0257658b150f717a136359 +Subproject commit 8c75e65b647238febd025 ...
- oracle重建、更新索引、索引统计信息命令
在oracle中查找所有的表的索引的命令 select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_na ...
- alpha属性设置
alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopacity,style,startX,startY,finishX,finishY).opacity ...
- dede 最近一天发布的文章标题前加hot
{dede:list pagesize ='15'} <!-- 模板1 --> <div class="news_list tp_a setp1"> < ...
- .net 学习路线感想
从上到大学到现在工作,已经有六年多了,发现学习编程到以开发为工作也是一个挺长的过程的. 大学中,从c语言到java.C#到其他各种语言的学习,还有其他知识的学习如:数据库(oracle.sql Ser ...
- JavaScript HTML DOM - 改变 HTML
JavaScript HTML DOM - 改变 HTML HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 H ...
- cos-26上传
在开发中常常需要上传文件,上传文件的方式有很多种,这里有一个cos实现的例子. 首先是要拷贝cos.jar包拷贝到WEB-INF/lib目录下,然后才进行编码. 创建一个可以进行自动重命名的Java文 ...
- cetos 6.3 安装 apache+mysql+php
1.安装 apache 服务器 yum install httpd 启动服务 service httpd start or /etc/init.d/httpd start 2.安装 mysql 数 ...