深度探索C++对象模型读书笔记-第六章执行期语意学
- 在函数中,编译器会帮助将析构函数(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的话,就导致无论是否使用都会触发该对象的创建和析构。
- new 和delete 运算符
int *pi = new int(5);
new运算符看起来似乎是一个单一运算,实际上由两个步骤完成的:
- 通过适当的new运算符函数实例,配置所需要的内存: int *pi = __new(sizeof(int))
- 将配置得带的对象设立初值: *pi = 5
- 布局new操作符并不支持多态。其行为是未定义的。
- C++标准允许编译器对于临时对象的产生有完全的自由度
例如:1: T operator+(const T&, const T&);
2: T a, b;
3: T c = a + b;
对于上面这段代码可能如下:
- 编译器产生一个临时对象,保存a+b的结果,然后再使用T的拷贝构造函数,把该临时性对象当做c的初始值
- 直接以拷贝构造的方式,将a+b的值放到c中。
- NRV(name return value)优化,直接在上述c对象中求表达式的结果,避免执行拷贝构造函数和具名对象的destructor
- 而对于临时对象的摧毁,则规定如下:
临时性对象的被摧毁,应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。1: ((objA > 1024) && (objB > 1024)) ? objA + objB : foo(objA, objB)
对于上面的表达式产生的任何一个临时对象,都是在整条语句执行完之后,才可以摧毁。
例外情况:
- 表达式用来初始化一个object:
1: bool verbose;
2: ...
3: string progNameVersion = !verbose ? 0 : progName + progVersion;
对于上面这种情况,由于progNameVersion需要使用该对象进行初始化,如果在初始化之前临时对象被析构,那么结果就是错误的。不是我们希望的。
标准要求:凡持有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止
- 当一个临时对象被一个reference绑定时:
标准要求:如果一个临时性对象被绑定于一个reference,对象将保留,知道被初始化值reference的生命结束,或直到临时对象的生命scope结束——视哪一种情况先到达。
深度探索C++对象模型读书笔记-第六章执行期语意学的更多相关文章
- 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端
Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的f ...
- 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)
1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...
- 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)
前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定 ...
- 深度探索C++对象模型读书笔记(2)
以下测试平台均为vs 2012 指向Data Member的指针测试(1) #include <stdio.h> class Base1 { public: int val1; int v ...
- 【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)
对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的 ...
- 【C++】深度探索C++对象模型读书笔记--构造函数语义学(The Semantics of constructors)(四)
成员们的初始化队伍(member Initia 有四种情况必须使用member initialization list: 1. 当初始化一个reference member时: 2. 当初始化一个co ...
- 深入探索C++对象模型 读书笔记
第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...
- 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)
<Microsoft Sql server 2008 Internals>索引文件夹: <Microsoft Sql server 2008 Internals>读书笔记--文 ...
- C primer plus 读书笔记第六章和第七章
这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...
随机推荐
- go build报错cannot find package
go env 关键数据是这样的 GOPATH="/home/zzy/goProject" GOROOT="/usr/local/go" 项目目录是这样的 goP ...
- php调用系统命令的函数的比较
了解命令的区别并进行直观的选择 这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择 前言 PHP有众多调用系统命令的函数,大致如下: system() exec() passthru ...
- 我的黑苹果之路 9400f + msi b360 mortar + 1050ti
硬件配置: CPU:i5 9400f 主板:微型msi迫击炮B360 内存:威刚 ddr4 8g 2133 *2 显卡:技嘉1050ti 4g 显示器:koiso 4K (使用的dp接口连接,hdmi ...
- poj 2752 kmp的next数组
题目大意: 求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标: 基本思路: 从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一 ...
- leetcode-162周赛-1255-得分最高的单词集合
题目描述: 方法:穷举暴力 class Solution: def maxScoreWords(self, words: List[str], letters: List[str], score: L ...
- 【dart学习】-- Dart之元数据
一,概述 元数据概述 元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历 ...
- mac os 下安装mysql
在 http://dev.mysql.com/downloads/mysql/ 选择下载mysql 注册并选择相应的版本后,得到下载链接:: wget http://dev.mysql.com/get ...
- centos 下安装 shpinx2.1.7 记录
安装sphinx yum install -y mysql mysql-devel yum install automake autoconf cd /usr/local/src/ wget http ...
- android API版本对应的系统版本及Android获取手机和系统版本等信息的代码
学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...
- Karaf基础知识
Karaf 遵循OSGi开发规范的一个Apache框架 1.命令形如:scope:name 举例:feature:list 2 shell:completion tab键补齐 GLOBAL 补齐显 ...