1. 在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置。对于函数中的局部对象,会将析构函数安插在对象的每一个离开点。
    例如:
       1: void Function(int a) {

       2:   Object obj;

       3:   swithch(a) {

       4:      case 0 :....;return;

       5:     case 1 : ....;return;

       6:     case 2 : ....;return;

       7:     default : ....;return;

       8:   }

       9: }

    在上面的函数中,在switch的每个分支中,都会安插Object对象的析构函数。

    一般而言,我们把Object尽可能放置在使用它的那个程序区段的附近,这么做可以节省非必要的对象产生操作和析构操作。 (注:即可能在代码的一些分支逻辑中,根本不会走到使用对象的分支。此时最好把相应对象的创建放在对应的分支逻辑中,以避免无论使用使用都执行对象的产生和析构操作

    例如

       1: void Function(int a) {

       2:   if (a < 0) {

       3:     return;

       4:   }

       5:   Object obj;

       6:   ....

       7:   return;

       8: }

    在上面的逻辑中,在传入的参数a小于0的时候,是不需要使用Object对象的。因此如果在函数的开始就创建Object的话,就导致无论是否使用都会触发该对象的创建和析构。

  2. new 和delete 运算符

    int *pi = new int(5);

    new运算符看起来似乎是一个单一运算,实际上由两个步骤完成的:

    1. 通过适当的new运算符函数实例,配置所需要的内存: int *pi = __new(sizeof(int))
    2. 将配置得带的对象设立初值: *pi = 5
  3. 布局new操作符并不支持多态。其行为是未定义的。
  4. C++标准允许编译器对于临时对象的产生有完全的自由度

    例如:

       1: T operator+(const T&, const T&);

       2: T a, b;

       3: T c = a + b;

    对于上面这段代码可能如下:

    1. 编译器产生一个临时对象,保存a+b的结果,然后再使用T的拷贝构造函数,把该临时性对象当做c的初始值
    2. 直接以拷贝构造的方式,将a+b的值放到c中。
    3. NRV(name return value)优化,直接在上述c对象中求表达式的结果,避免执行拷贝构造函数和具名对象的destructor
  5. 而对于临时对象的摧毁,则规定如下:

    临时性对象的被摧毁,应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。

       1: ((objA > 1024) && (objB > 1024)) ? objA + objB : foo(objA, objB)

    对于上面的表达式产生的任何一个临时对象,都是在整条语句执行完之后,才可以摧毁。

    例外情况:

    1. 表达式用来初始化一个object:

         1: bool verbose;

         2: ...

         3: string progNameVersion = !verbose ? 0 : progName + progVersion;

      对于上面这种情况,由于progNameVersion需要使用该对象进行初始化,如果在初始化之前临时对象被析构,那么结果就是错误的。不是我们希望的。

      标准要求:凡持有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止

    2. 当一个临时对象被一个reference绑定时:

      标准要求:如果一个临时性对象被绑定于一个reference,对象将保留,知道被初始化值reference的生命结束,或直到临时对象的生命scope结束——视哪一种情况先到达。

深度探索C++对象模型读书笔记-第六章执行期语意学的更多相关文章

  1. 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端

    Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的f ...

  2. 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

    1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...

  3. 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)

    前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定 ...

  4. 深度探索C++对象模型读书笔记(2)

    以下测试平台均为vs 2012 指向Data Member的指针测试(1) #include <stdio.h> class Base1 { public: int val1; int v ...

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

    对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的 ...

  6. 【C++】深度探索C++对象模型读书笔记--构造函数语义学(The Semantics of constructors)(四)

    成员们的初始化队伍(member Initia 有四种情况必须使用member initialization list: 1. 当初始化一个reference member时: 2. 当初始化一个co ...

  7. 深入探索C++对象模型 读书笔记

    第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...

  8. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

    <Microsoft Sql server 2008 Internals>索引文件夹: <Microsoft Sql server 2008 Internals>读书笔记--文 ...

  9. C primer plus 读书笔记第六章和第七章

    这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...

随机推荐

  1. Neo4j数据库学习一:安装和数据类型常用命令简介

    Neo4j数据库是图数据库 在数据库中,只有节点Nodes和关系Relationships Nodes用圆圈表示,Relationships用有向箭头表示 关系和节点都有属性(键值对) 安装3.3.7 ...

  2. 初探Remoting双向通信(四)

    原 初探Remoting双向通信(四) 2013年06月26日 11:11:32 喜欢特别冷的冬天下着雪 阅读数 2632 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  3. AMS5601的ardunio和STM32驱动开发

    AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写,并提供相应产品服务. 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600,能够输出pwm信号,电压信号以及I2C通信 ...

  4. windows上测试网络数据跳转路径

    今天遇到一个有关路由方面的问题,所以向一位CCIE大神问了点问题.就是关于ip ping包出了pc之后怎么走的. 然后告诉我了这么一个命令: Tracert(跟踪路由)是路由跟踪实用程序,用于确定 I ...

  5. logo的普遍写法

    h1为了搜索引擎优化<div class="logo"> <h1> <a href="#">XX</a> < ...

  6. python_异常

    异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise) ...

  7. JavaScript常见设计模式梳理

    单例模式 单例模式,顾名思义就是保证每个类都只有一个实例对象. 其实现思路很简单,先判断实例是否存在,如果不存在则创建新的实例返回,如果存在则直接返回该实例. 策略模式 策略模式可以理解为:封装多个可 ...

  8. Vue学习笔记【17】——配置本地数据库和数据接口API

    先解压安装 PHPStudy; 解压安装 Navicat 这个数据库可视化工具,并激活: 打开 Navicat 工具,新建空白数据库,名为 dtcmsdb4; 双击新建的数据库,连接上这个空白数据库, ...

  9. 学习android文档 -- Adding the Action Bar

    1. Setting Up the Action Bar:users-sdk version 11以上可以使用holo主题:如果不使用holo主题,或者sdk版本较低,则需要在manifest文件的& ...

  10. anaconda里的python版本回退, requirements

    事情起因:我用的python3.7 , 同事机器学习的部分使用tensorflow,只支持python3.6, 所以我从3.7回退到3.6 conda create -n python36 pytho ...