深度探索C++对象模型---data语意学

一个空的class如:
    //sizeof(X) ==1
    class X{};
    事实上并不是空,它有一个隐藏的1byte大小,那是被编译器安插进去的一个char,这使得这一class的两个Object得以在内存中配置独一无二的地址:
    X a,b;
    if(&a == &b)
        cerr<<"yipes"<<endl;
    
    
    //sizeof(Y)==sizeof(Z)==8
    class Y :public virtual X{};
    class Z :public virtual X{};
    Y和Z的大小都是8,这个大小和机器有关,也和编译器有关。事实上Y和Z的大小受到三个因素的影响:
    1.语言本身所造成的额外负担。
    当语言支持virtual base classes时,就会导致一些额外负担,在derived class中,这个额外负担反映在某种形式的指针身上,它或者指向virtual base class subobject,或者指向一个相关表格,表格中存放的不是virtual base class subobject的地址,就是其偏移量。
    2.编译器对于特殊情况所提供的优化处理。
    virtual base class subobject的1bytes大小也会出现在Y和Z身上。传统上他被放在derived的固定部分的尾端。某些编译器会对empty virtual base class提供特殊支持。
    3.Alignment 的限制。
    class Y和Z的大小截止目前位置为5bytes,在大部分机器上,聚合的结构体大小会受到alignment的限制。使它们能够更有效的在内存中被存取。alignment是4bytes,所以classY和Z必须填补3bytes,最终得到8bytes。
    注意:alignment就是将数值调整到某数的整数倍。在32位计算机上,通常alignment为4bytes(32bit),以使bus的运输量达到最高效率。
    
    某些编译器对此提供了特殊的处理。一个empty virtual base class被视为derived class Object最开头的一部分,也就是说它并没有花费任何的额外空间。这就节省了1bytes(因为既然有了members,就不需要原本为了empty class 而安插一个char),也就不再需要填补了。在此模型下,Y和Z的大小就是4而不是8.
    



    C++对象模型尽量以空间优化和存取速度优化的考虑来表现nonstatic data members,并且保持和C语言struct数据配置的兼容性。他把数据直接存放在每一个class Object之中。对于继承而来的nonstatic data member输液室如此。
    至于static data member ,则被放置在程序的一个global data segment中,不会影响个别的class的大小。在程序之中,不管该class被产生多少个Object,static data members永远只存在一份实例。但是一个Template class 的static data members的行为有所不同。
    每一个class Object因此必须有足够的大小以容纳它所有nonstatic data members。有时候其值可能会更加大:
    1.由编译器自动加上的额外data members,用以支持某些语言特性(主要是各种virtual 特性)
    2.因为alignment(边界调整)的需要。

  • 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、付费专栏及课程。

余额充值