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

***对象的构造和解构***

一般而言,我们会把object尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象 产生操作和销毁操作。

***全局对象***

全局对象的静态初始化策略包括以下几个步骤:

(1)为每一个需要静态初始化的对象产生一个_sti_……()函数,内含必要的 constructor调用操作或inline expansions;

(2)为每一个需要静态的内存释放操作的对象产生一个_std_……()函数,内含必要 的destructor调用操作或inline expansions;

(3)在main()函数的首尾分别添加一个_main()函数(用以调用可执行文件中的所有_sti()函 数)和一个_exit()函数(用以调用可执行文件中的所有_std()函数)。

建议根本不要用那些需要静态初始化的全局对象。

***局部静态对象***

假设我们有以下程序片段:

const Matrix& identity() {
static Matrix mat_identity;
// ...
return mat_identity;
}

此处的local static class object保证了以下语意:

(a)mat_identity的constructor必须只能施行一次,虽然上述函数可能会被调用多次;

(b)mat_identity的destructor必须只能施行一次,虽然上述函数可能会被调用多次。

编译器的实际做法如下:在第一次调用identity()时把mat_identity构造出来,而在与相应文件关 联的静态内存释放函数中将其解构。(局部静态对象的地址在downstream component中将会被转换到程 序内用来放置global object的data segment中)

***对象数组***

如果你想要在程序中取出一个constructor的地址,这是不可以的。然而经由一个指针来激活 constructor,将无法存取default argument values.那么,如何支持以下的语句:

complex::complex(double=0.0, double=0.0);

当程序员写出:

complex c_array[10];

时,编译器最终需要调用:

vec_new(&c_array,sizeof(complex),10,&complex::complex,0);

为了解决这个问题,可由编译器产生一个内部的constructor,没有参数,在其函数内调用由程序员 提供的constructor,并将default参数值明确地指定过去:

complex::complex()
{
complex(0.0, 0.0);
}

时间: 2016-01-05

《深度探索C++对象模型》读书笔记(6)的相关文章

深度探索C++对象模型(3)

介绍 多态是一种威力强大的设计机制,允许你继承一个抽象的public接口之后,封装相关的类型,需要付出的代价就是额外的间接性--不论是在内存的获得,或是在类的决断上,C++通过class的pointer和references来支持多态,这种程序风格就称为"面向对象". 大家好,雷神关于<深度探索C++对象模型>笔记终于又和大家见面了,速度慢的真是可以.好了不浪费时间了,直接进入主题. 这篇笔记主要解决了几个常常被人问到的问题. 1.C++支持多重继承吗? 2.结构和类的区别

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

第6章主要讲述了执行期语意学,主要内容是关于数组的在构建和析构是如何进行的. 第7章主要讲述了有关Template的相关内容. 这两章内容散见于<Effective C++>.<More Effective C++>.<C++Primer><C++Templates中 文版>等书籍,如果感兴趣请阅读对应的书籍. 本读书笔记主要想谈一下对语意的理解. 本人认为C++程序设计可以简单分为三个层次:语法层.语言语意层(就像<深度探索C++对象模型>所讲

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研读,由于该书的内容给人比较散的感觉,所以一直想找个时间整理一下,遂成此文,虽然都是抄书上的,但是却让我有了温故而知新的觉悟,附近里有三个好资料,一并共享了!2012年9月2日凌晨 4:31 谢谢 张雨生的歌声的相伴!   <

深度探索C++对象模型(7)

关于<深度探索C++对象模型>停顿了半个月,今天继续啃这个骨头,我的学习进入了第四章,函数的语意学.先做个复习C++支持三种成员函数:静态.虚.和非静态.每一种函数的调用方式都不同,当然他们的作用也会有区别,一般来说我们只要掌握根据我们的需要正确的使用这三种类型的成员函数便可以了,至于内部是如何运做的我们可以不知.但是<深度探索C++对象模型>正是让我们对这些不知道的东西进行深度探索的一本书.通过前面的学习,我想我知道了一些以前不知道的东西,但是感觉并没有提高多少,也许是我对此书的

深度探索C++对象模型(2)

史列因:我刚看了你写的"深度探索C++对象模型(1)",感觉很不错.不过我有一个建议:你说"谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生"是很自然的.第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了.第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了.这本书中很多内容都是前后重复的.我建议你先不管看懂看不懂,只管向后看,之后再从头看几遍,那样效果好得多. 我想史列因说的应该是一种非常好的阅读方式,类似<深度探索C++对象模型&g

深度探索C++对象模型(4)

雷神跌跌撞撞的读完了<深度探索C++对象模型>的第一章,虽然还是有些疑惑,但是已经感到收获很大.按照朋友的说法,第一章是一个概括的介绍,具体的细节会在以后的章节阐述,如果没有通读本书,第一章还是比较不容易理解的.雷神听过之后信心倍增,也不在有初看此书时的"世界末日"的感觉了(在第2篇雷神感到学了近一年的C++,居然水平如此之差),并且通过自己的努力,还是摸到了些门道,所以让我们继续快乐的出发,踏上深度探索C++对象模型的旅程.记住我们在第一篇的小文<坚持不懈,直到成功

c++-深度探索C++对象模型 虚函数表指针问题

问题描述 深度探索C++对象模型 虚函数表指针问题 <深度探索C++对象模型>中文版116页, "某些编译器设计了一种优化技术,只要第二个(或后继)base class声明了一个virtual function,而第一个base class没有,就把多个base classes的顺序调换.这样可以在derived class object中少产生一个vptr" vptr是如何减少的,想不明白,跪求解答 解决方案 没有虚函数的基类就不需要vptr了 解决方案二: 这个涉及虚表

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

在C++中,有两种class data members:static和nonstatic,以及三种class member functions: static.nonstatic和virtual.已知下面这个class Point声明: class Point ...{ public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream&

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

***Template的"具现"行为*** template class中的任何member都只能通过template class的某个实体来存取或操作. Point<float>::Status s; // ok Point::Status s; // error 如果我们定义一个指针,指向特定的实体,像这样: Point<float> *ptr = 0; 由于这是一个指向class object的指针,本身并不是一个class object,编译器不需要知道