《深度探索C++对象模型》读书笔记

原创 2016年08月28日 18:25:29

第三章(The Semantics of Data)

一个空的class的大小并不为0;

class x {   };//sizeof(x) = 1;
即空的class并不是真的空,它有一个隐晦的1bytes,那是编译器安插进去的一个char,这使得这个class的两个objects得以在内存中配置独一无二的地址:

X a, b;
if(&a == &b) cout << "error" << endl;

class的大小受到三个因素的影响:

  • 语言本身所造成的额外负担,virtual(vptr)
  • 编译器对于特殊情况所提供的优化处理(比如空class中插入一个char)
  • Alignment的限制(对齐的限制)

注意:nonstatic data members和继承而来的nonstatic data members(不论是virtual或nonvirtual base class), 都会直接存放在每个class object之中。static data members,被放置在程序的一个global data segment中,不会影响个别的class object的大小,不管class产生多少个objects(直接或间接产生),static data members永远只存在一份实体。

Point3d origin, *pt = &origin;
(1)origin.x = 0.0;
(2)pt->x = 0.0
那么通过origin存取和通过pt存取,有差别吗?答案是有

每一个nonstatic data member的偏移量(offset)在编译时期即可获知,甚至如果member属于一个base class subobject也奕扬,因此存取一个nonstatic data member,其效率和存取一个C struct member获一个nonderived class的member是一样的。(1)可以确定编译期间就可以知道其是origin的x,固定的;(2)如果x是从virtual base class继承来的,那么pt指向哪一个class type?所以这个操作必须延迟到执行期,(vptr)才能知道。


静态成员在使用前必须要进行初始化,在class内进行定义,在class外进行初始化

class A{
public:
    static int x;
};
int A::x = 1;
注意初始化的方式,程序中使用使,使用A::x即可,如果考虑继承或者虚继承,也永远记住:静态成员只有唯一一个实体(如果有继承不管使用base::x还是driverd::x得到值都是一个值

容易犯的一个错误是,把一个class分解为两层或更多层,有可能会膨胀所需空间。


多态的开销

多态会带来的开销:

  1. 每个 class有一个与之相关的vitual table(虚函数表),用来存放它所声明的每一个virtual functions的地址, table的元素数目通常是virtual functions的数目
  2. 在每一个class object中导入一个vptr,提供执行期间的链接,使每个object能够找到相应的virtual table
  3. 加强constructor函数,使它能够为vptr设定初值
  4. 加强destructor函数
对于单继承,base class和derived class的objects都是从相同的地址开始,其间差异在于derived object比较大,用以容纳它自己的nonstatic data members,
 dervied A;
 base *B = &A;让基类指针指向派生类很自然。但是如果base中没有虚函数,而derived中有虚函数,那么这种规则就可能被打破,因为derived object中有一个vptr,vptr的插入可能会打破内存布局,那么此时进行转换时,就需要编译器的介入。多重继承更是打破这种布局。

版权声明:本文为博主原创文章,未经博主允许不得转载。

《深度探索C++对象模型》读书笔记——关于对象【for_wind】

//整理之,分享之,欢迎指正。for_wind 1、C与C++的区别:       概括来说,C程序中程序性地使用全局数据[注1]。而C++采用ADT(abstract data tpye)或...
  • for_wind
  • for_wind
  • 2014年03月28日 14:08
  • 1383

[读书笔记] 深入探索C++对象模型-第一章《关于对象》

最新在看深入探索C++对象模型(Inside C++ object model),看的同时针对一些之前没有留意或者理解不深的内容整理一下读书笔记,方便之后复习,也希望可以帮助到有同样疑惑的人。 下面是...
  • beyongwang
  • beyongwang
  • 2016年08月21日 21:14
  • 583

深度探索c++对象模型

所谓知己知彼,百战不殆。只有深入了解了c++对象的内存布局,我们才能更熟练运用c++这门语言。 运行环境vs2013一单继承和多继承的结合class C { public: C() :c(1...
  • db199410
  • db199410
  • 2016年06月16日 17:40
  • 371

深度探索c++对象模型(一)_关于对象

原博客地址:http://www.roading.org//develop/cpp/c对象面面观.html 学习C++应该看过不少关于C与C++的口水贴,以及关于各种对比C与C++效率比较的...
  • A_IIIIIIIII_A
  • A_IIIIIIIII_A
  • 2016年01月04日 11:31
  • 510

《深度探索c++对象模型》读书笔记(一)

本文以下内容为深度探索c++对象模型的笔记 深度探索c++对象模型是Stanley B Lippman的著作,对c++进行了较深层次的探讨。于我而言,这本书解答了我多年(半年)的疑惑: 虚函数是怎...
  • cover_s
  • cover_s
  • 2016年08月30日 15:51
  • 560

《深度探索C++对象模型》读书笔记(一)

Lippman早期在贝尔实验室,和C++发明者Bjarne Stroustrup设计了全世界第一套C++编译器cfront,还著有经典的C++入门书[Ensential C++](https://bo...
  • Draco_mystack
  • Draco_mystack
  • 2017年04月18日 22:43
  • 157

《深度探索C++对象模型》(一)对象模型、存储形式;默认构造函数一定会构造么?

一)、读后感     在我参加工作两年多的时候,工作不算很忙了,《深入理解C++对象模型》开始进入我的视野;或许是因为我要从Symbian.C++ 转向iOS Objective-C,并开始思考语言本...
  • hherima
  • hherima
  • 2013年05月11日 23:02
  • 4181

《深度探索C++对象模型》:Data语意学

《深度探索C++对象模型》:Data语意学
  • hujingshuang
  • hujingshuang
  • 2016年10月21日 11:34
  • 875

《深入探索C++对象模型》第三章奇怪语句解释

在第三章的3.3节有下面这样一段描述: class Point3d { private: float x; private: float y; static const int ch...
  • wang1902568721
  • wang1902568721
  • 2016年06月29日 19:38
  • 217

深度探索C++对象模型-构造函数语义学

default constructor构建 default constructors在编译器需要的时候产生,区别于程序设计者的需要。以下程序进行说明: class A(public: int v;);...
  • isunn
  • isunn
  • 2015年04月19日 17:29
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深度探索C++对象模型》读书笔记
举报原因:
原因补充:

(最多只允许输入30个字)