【深度探索C++对象模型】第四章 Function语意学

Member的各种调用方式

Nonstatic Member Functions

​ C++要求非静态成员函数必须要和一般的非成员函数具有相同的效率。采取的措施是通过以下步骤将成员函数实例转换为对等的非成员函数实例:

  1. 改写函数的原型(signature)以安插一个额外的参数this到成员函数中,用以提供一个存取管道

  2. 将每一个对非静态成员变量的存取操作改为经由this来存取

  3. 将成员函数重新写成一个外部函数,将函数名称经过“mangling”处理,使其在程序中成为独一无二的词汇,这个矫正操作不包含函数的返回值

    关于mangling操作,即name mangling(名称的特殊处理)操作有一个成熟的规则:

    • 成员函数的名称前面加上class的名称

    • 为了应付重载,再在后面加上参数链表,记住,返回值并不作为参考

Virtual Member Functions

我们假设foo()是一个虚函数,那么以下的调用:

  
  ptr->foo()  

将被内部转化为:

  
  (*ptr->vptr[1])(ptr)  

其中vptr表示由编译器产生的指针,指向virtual table,注意一个class内可能含有多个vptrs。但是对于以下调用:

  
  obj.foo()  

如果编译器将其转换为上面一样的调用,虽然语意正确,但是没有必要。因为由对象直接调用不会产生多态,在编译期间即可决议,即这种操作应该总是被编译器像对待一般非静态成员函数一样加以决议——重写函数原型,转换为同等的非成员函数调用。这就是为什么即使覆盖了虚函数表,用对象调用虚函数也不会产生多态的原因。

Static Member Functions

其实只要注意静态成员函数没有this指针,其它的转换操作和非静态是一样的,以下特性都是根据此特性来的:

a.不能直接存取其class的非静态成员

b.不能被声明为const、volatile、virtual,因为这些都需要this指针来支持

c.不需要经由class object才被调用

Virtual Member Functions

​ 在C++中,多态表示“以一个public base class的指针(或reference),寻址出一个drived class object”的意思。例如下面声明:

  
  Point *ptr;
  ptr=new Point2d;

​ ptr的多态机能主要扮演一个输送机制的角色,经由它,我们可以在程序的任何地方采用一组public derived类型。这种多态形式被称为消极的(passive),可以在编译期完成——virtual base class的情况除外。当被指出的对象真正被使用时,多态也就变成积极的(active)了。

​ 执行期需要正确调用virtual function需要知道:

  • ptr所指对象的真实类型。可使我们正确找到调用实例;

  • 实例的位置,以便能够调用它。

单一继承下Virtual Table布局:

多重继承下的Virtual Functions

如下图所示继承关系:

  
  class base1{ ... };  
  class base2{ ... };  
  class derived:public base1,public base2{ ... };

派生类支持虚函数的困难度,统统落在了base2的身上。base1的多态是毫无困难的,因为base1的内容在派生类的上方,可以使得完美表现多态,而base2就悲剧了,在中间,想要支持多态,有点困难,比如下面的例子:

  
  base2 *pbase2 = new derived;  
  //编译器会产生以下代码  
  derived *temp = new derived;  
  base2 *pbase2 = temp?temp+sizeof(base1):0  

因为编译器要确保派生类能够表现的和基类一样,“is a”关系。当程序员需要删除pbase2指针的时候,指针必须再一次调整,以之处完整对象的起始点。

​ 多重继承下,一个drived class内含n-1个额外的virtual tables,n表示其上一层base class的个数(因此,单一继承将不会有额外的virtual tables)。对于本例的Drivered而言,会有两个virtual tables被编译器产生出来:

  1. 一个主要实例,与Base1共享;

  2. 一个次要实例,与Base2有关。

对于每一个virtual tables,Drivered对象中有对应的vptr。vptrs将在constructor(s)中被设立初值。

下图为本例Virtual Table的布局:

虚拟继承下的Virtual Functions

Inline Function

​ 在C++中,我们并不能强迫将任何函数都变成lnline,虽然有inline这个关键字,但这只是个请求,编译器并不一定会接受。一般而言,处理一个内联函数有两个阶段:

  1. 分析函数定义,以决定函数的“intrinsic inline ability”,即判断函数的复杂程度,申明为内联是否合算;(要求其执行成本比一般函数调用及返回机制所带来的负荷低)

  2. 真正的内联函数扩展操作是在调用的那一点上,这会带来参数的求值操作和临时性对象的管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《深度探索C++对象模型》是由侯捷所著的一本经典的C++图书,该书于2012年由机械工业出版社出版。本书的主要内容涵盖了C++对象模型的深入解析和探讨。 在书中,作者详细讲解了C++中的对象模型和相关的概念,如类、对象、继承、多态等。作者首先介绍了C++对象模型的基本概念和特点,包括对象的内存布局、虚函数表和虚函数指针等。然后,作者深入探讨了C++中的继承机制和多态性,包括单继承、多继承、虚继承等。作者还详细介绍了虚函数的实现原理和使用方法。 在书中,作者对C++对象模型的实现细节进行了深入的剖析,包括成员变量和成员函数的内存布局、函数指针和成员函数指针的用法等。同时,作者还讨论了C++中的一些高级特性,如模板、内存管理和异常处理等。通过对C++对象模型深度探索,读者可以更好地理解C++的内部机制和原理,提高程序设计和开发能力。 《深度探索C++对象模型》适合具有一定的C++编程基础的读者阅读,尤其是对C++对象模型感兴趣的读者。通过阅读本书,读者可以进一步了解C++的底层实现和运行机制,从而提高自己的编程能力和代码质量。此外,本书还提供了大量的示例代码和实践案例,可以帮助读者更好地理解和应用所知识。 总之,《深度探索C++对象模型》是一本深入探讨C++对象模型的经典著作,通过对C++的底层实现和内部机制的剖析,帮助读者深入理解C++编程语言,并提高自己的软件开发能力。 ### 回答2: 《深度探索C++对象模型》是由Stanley B. Lippman于1994年所著的一本经典畅销的C++书籍,该书详细介绍了C++对象模型的内部实现细节。 C++对象模型是指C++编译器在处理对象、继承、多态等面向对象特性时所采用的具体实现方式。这本书通过对对象模型的剖析,帮助读者深入理解C++的内部工作原理,从而写出更高效、更可靠的C++代码。 在《深度探索C++对象模型》中,作者首先介绍了对象、虚函数、继承等C++核心概念,然后详细讲解了C++对象模型的构建过程,包括对象布局、成员函数指针、虚函数表等。作者逐步深入地剖析了C++对象模型在内存中的表示方式,解释了为什么C++可以支持如此强大的面向对象特性。 此外,本书还探讨了一些高级主题,如多重继承、虚拟继承、构造函数和析构函数的执行顺序等。对于想要深入C++的读者来说,这本书提供了一些宝贵的技术手册和实用的经验。 尽管《深度探索C++对象模型》的出版时间是1994年,但它仍然被广泛认可为C++对象模型的经典之作。在2012年时,由于C++的发展和演进,也许一些内容已经有些过时,但很多基本概念和原理仍然适用。 总而言之,《深度探索C++对象模型》是一本值得阅读的C++经典著作,通过深度探索C++对象模型,读者可以更加深入地了解C++的内部工作原理和实现方式,提升自己的开发技能。 ### 回答3: 《深度探索C++对象模型》是一本于2012年出版的书籍。该书的作者Andrews和Sorkin以全面的角度深入探讨了C++对象模型。该书重点介绍了C++中的对象表示、虚函数、继承、多重继承、构造函数、析构函数等内容,以及与之相关的语法、原理和底层实现。 这本书为读者揭示了C++对象模型的奥秘,让人更加深入地理解C++语言中的类和对象。作者通过分析对象布局、虚函数表、虚函数调用、多继承中的数据布局和函数调用等等,解释了C++对象模型的实现机制。 在读者了解C++对象模型的基础上,该书还介绍了如何有效地利用对象模型来提高程序的性能。作者讨论了虚函数的成本以及如何减少虚函数调用的开销,提供了一些优化技巧。此外,书中还对C++的构造函数和析构函数进行了深入的讨论,详细解释了构造函数和析构函数的执行机制和注意事项。 总的来说,《深度探索C++对象模型》是一本深入剖析C++对象模型的重要参考书籍。通过阅读该书,读者可以更加全面地了解C++的类和对象的实现原理,对于理解C++语言的底层机制和优化程序性能具有积极的作用。无论是对于初者还是有一定C++基础的开发人员来说,该书都是一本值得阅读的重要参考书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值