码迷,mamicode.com
首页 > 其他好文 > 详细

Function 语意学

时间:2015-03-04 21:07:26      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:c++   c++对象模型   函数语意学   

概述

在前面文章《C++对象模型》可以知道,class 中成员函数的类型有:nonstatic member function、static member function、virtual member function;不同类型的成员函数的调用会有不同的表现,以下对每一种类型的成员函数进行简单的分析。

nonstatic member functions

为了使 nonstatic member function 能够与非成员函数具有相同的效率,C++ 编译器内部将 nonstatic member function 转换为非成员函数,转换的步骤如下:

  1. 改写函数的 signature(函数原型)以添加一个 this 指针;
  2. 通过 this 指针存取操作 nonstatic data member;
  3. 将成员函数经过名称特殊处理转换为非成员函数;

例如:

class example{
public:
    void func();
};
/* 其中成员函数 func() 会被编译器内部转换为 void func(example *this)*/

Static member functions

Static member function 和 nonstatic member function 一样会被编译器内部转换为非成员函数,区别是转换后不存在 this 指针,因此和全局函数一样,可以做 callback 函数。Static member function 有以下的特性:

  1. 不能直接存取其 class 中的 nonstatic member;
  2. 不能被声明为 const、volatile 或 virtual;
  3. 一般不需要经由 class object 调用;

virtual member function

独立的 class

在独立的 class 中 virtual member function 的调用有两种方式:指针调用对象调用。例如:

class A {
    virtual void func();
};
A aA *pA;
a.func();
pA->func();

用指针调用pA->func()在编译器内部被转换为( * pA->vptr[1])(pA)
用对象调用 a.func() 在内部被当作和非虚拟成员函数一样处理,即转换为A::func(&a);所以 virtual 可以inline,在用对象调用的情况下inline 被展开。

单一继承的 class

具有 virtual member function 的 class,编译器对其产生一个 vtable, 把指向虚函数地址的指针放在该表格中;继承含有 virtual member function 类的派生类具有以下的特性:

  1. 保留 base class 中每个 virtual function 的指针在 vtable 中的索引值及其顺序;
  2. 若 derived class 改写了该 virtual function,则在表格中对应的项上用新函数的地址替换原来函数的地址;
  3. 当 derived class 增加新的虚函数,新的虚函数的地址放在 vtable 中靠后的地方,并不影响表格中已有函数的次序;

多重继承的 class

像单继承一样,用基类的指针或引用只能访问基类中定义(或继承)的成员,不能访问派生类中引入的成员。当一个类继承于多个基类的时候,那些基类之间没有隐含的关系,不允许使用一个基类的指针访问其他基类的成员。

在多重继承的 virtual function 机制中,其复杂度围绕在第二个及后继的 base class 中,以及在执行期间调整 this 指针;一般规则经由指向第二或后继 base class 的指针或引用来调用 derived class virtual function。

虚继承的 class

在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的基类子对象称为虚基类。

指向成员函数的指针

class A {
    void func();
    virtual void x();
};

对非虚函数void func(),取它的指针得到的是函数的实际地址(即绑定在某个 class object 的地址),如:void (A::*pfunc) () = &A::func;
对虚函数virtual void x(),取它的地址得到的是xclass A 的 vtable 中的索引值,如:viod (A::*pfunc) () = &A::x;
使用 class object 或指向class object 的指针来调用,即用a.*pfunc()pa->*pfunc() 调用;

Inline Function

当我们在 class 中定义 inline function 时,编译器会根据函数的复杂程度决定是否真正定义为 inline 类型,对不能真正定义为 inline function 的请求,编译器可能把它们处理为 static member function;真正的 inline function 的扩展操作是在调用的那一点上,这会带来参数的求值操作以及临时性对象的管理;

Function 语意学

标签:c++   c++对象模型   函数语意学   

原文地址:http://blog.csdn.net/chenhanzhun/article/details/44061111

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!