c++对象模型研究6:执行期

C++的一件困难事情:不太容易从程序代码看出表达式的复杂度。

执行期语意学,即在程序执行时,编译器产生而外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行。

对象的构造和析构

一般而言,我们会把对象尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象产生操作和摧毁操作(主要是析构)。不建议把所有的对象放在函数或某个区段的起始处。

全局对象

对于全局变量,C++会保证在调用全局变量之前,将全局变量构造出来。

而所有的全局变量都被放置在程序的数据段中(data segment),并且为没有显示指定值的变量初始化为0。

同时对于全局的类对象,在编译时期被放置于data segment中并且内容也为0.只有在程序启动时其对应的constructor才会实施。因此object需要静态初始化。

静态初始化的munch策略:

1.为每个需要静态初始化的文件产生一个_sti()函数,内含必要的constructor调用操作和inline expansions。

2.为每一个需要静态的内存释放操作的文件,产生一个_std()函数。

3.提供一个_main()函数调用所有的_sti()函数,一个_exit()函数调用所有的_std()函数

局部静态对象

参考:

《深度探索C++对象模型》

http://blog.csdn.net/zone_programming/article/details/50411511

时间: 2024-07-28 19:46:09

c++对象模型研究6:执行期的相关文章

c++对象模型研究3:数据

开始前先看看 class X {}; class Y:public virtual X {}; class Z:public virtual X {}; class A:public Y,public Z {}; 上述X,Y,Z,A中没有任何一个class内含明显的数据,其间只表示了继承关系. 按照书上的例子 sizeof X = 1 sizeof Y = 8 sizeof Z = 8 sizeof A = 12 译注是 sizeof X = 1 sizeof Y = 4 sizeof Z =

【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)

对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的内容为0. 如果全局对象如果有构造函数或析构函数的话,我们说它需要静态的初始化操作和内存释放操作.编译器的执行步骤如下: 1.为每一个需要静态初始化的文件产生一个_sti()函数,内含必要的构造函数调用操作. 2. 在每一个需要静态的内存释放操作的文件中,产生一个_std()函数,内含必要的析构操作

【转载】图说C++对象模型:对象内存布局详解

原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有所不同.文章如果有解释不清.解释不通或疏漏的地方,恳请指出. 回到顶部 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层

c++ 对象内存布局详解

今天看了的,感觉需要了解对象内存的问题. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层实现机制. 直接支持面向对象程序设计,包括了构造函数.析构函数.多态.虚函数等等,这些内容在很多书籍上都有讨论,也是C++最被人熟知的地方(特性).而对象模型的底层实现机制却是很少有书籍讨论的.对象模型的底层实现机制并未标准化,不同的编译器有一定的自由来设计对象模型的实现细节.在我看来,对

Web性能测试

一.引言 随着网络技术的迅速发展,尤其是WEB及其应用程序的普及,各类基于WEB的应用程序以其方便.快速,易操作等特点不断成为软件开发的重点.与此同时,随着需求量与应用领域的不断扩大,对WEB应用软件的正确性.有效性和对WEB服务器等方面都提出了越来越高的性能要求,对WEB应用程序进行有效的系统的测试也逐渐成为人们研究的重要课题. 目前可以见到各种WEB服务器平台,然而根据Mereury的研究报告,98%的WEB服务器都没能达到人们所期望的性能,平均只能发挥人们所期望性能的1/6左右.WEB性能

Java虚拟机(二)对象的创建与OOP-Klass模型

相关文章 Java虚拟机系列 前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案. 1.对象的创建 对象的创建通常是通过new一个对象而已,当虚拟机接收到一个new指令时,它会做如下的操作. (1)判断对象对应的类是否加载.链接.初始化 虚拟机接收到一条new指令时,首先会去检查这个指定的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被类加载

【c++工程实践】内存模型

0.文章内容简介 这篇文章主要来讨论C++对象在内存中的布局,属于第二个概念的研究范畴.而C++直接支持面向对象程序设计部分则不多讲.文章主要内容如下: 虚函数表解析.含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表,vptr,先了解虚函数表的构成,有助对C++对象模型的理解. 虚基类表解析.虚继承产生虚基类表(vbptr),虚基类表的内容与虚函数表完全不同,我们将在讲解虚继承时介绍虚函数表. 对象模型概述:介绍简单对象模型.表格驱动对象模型,以及非继承情况下的C++对象模型.

关于web测试应该怎样进行

(一)WEB测试的内容与目的 测试的目的是证伪,但不能片面的理解为简单的找到BUG就可以了.软件测试应该经历以下四个步骤: 1.测试人员描述发现的问题(找到BUG): 2.测试人员详细阐明是在何种情况下测试发现的问题,包括测试的环境.输入的数据.发现问题的类型.问题的严重程度等情况: 3.测试人员协同开发人员一起去分析BUG的原因,找出软件的缺陷所在: 4.测试人员根据解决的情况进行分类汇总,以便日后进行软件设计的时候提供参考,避免以后出现类似软件缺陷. (二)制定WEB测试计划 当我们明确了测

深度探索C++对象模型第6章 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作. 全局对象 如果我们有以下程序片段: Matrix identity main() { //identity 必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity