《深度探索C++对象模型》读书笔记第六章:执行期语意学

stm32cubeMX使用HAL库点亮LED流水灯 目录 阅读详情


  • C++保证一定会在 main() 函数之前构造出全局对象,在 main() 函数结束之前把全局对象摧毁掉。这是静态的初始化操作和内存释放操作。
  • C++中所有的全局对象都放在程序的 data segment 中。如果明确给它一个值,对象将以该值为初值,否则对象所配置到的内存内容全为 0。包括 POD类型,这个C语言不一样。在C中专门有 .bss 段来存放未初始化的全局变量。

  • cfront 采用 munch 策略保证全局对象的构造与析构,有三部曲:
    1. 为所有的需要静态初始化的档案产生一个__sti() 函数,内带必要的 constructor 调用操作或 inline expansions。
    2. 在所有需要静态的内存释放操作的文件中,产生一个__std()函数(static deallocation),内带必要的 destructor 操作,或是其 inline expansions。
    3. 提供一组 runtime library “munch” 函数:一个 _main() 函数(用以调用可执行文件中所有的 __sti() 函数),以及一个 exit() 函数(以类似方式调用所有 __std() 函数。
如图:
’

  1. 对于对象数组,cfront 中采用 vec_new() 函数初始化数组中的对象,你可以显示初始化某几个对象,那么其他对象或许会默认构造初始化或者由于 trivial 什么也不做。
  2. 对于:point *ptr = new point3d[10]; 这种多态申请对象数组,如果直接 delete[] ptr,可能不会触发多态(亲测:gcc直接 core dump)。所以必须进行强制转换,使用delete[] static_cast<point3d*>(ptr);
  3. placement new 不分配内存,只调用构造函数。所以要提前申请好内存,防止段错误。
  4. placement new 在一个原已存在的对象上构造新对象,而该对象有一个析构函数,这个析构函数并不会调用。所以需要显示将原有对象销毁掉,但是不能直接 delete,因为直接 delete 会将内存也释放掉,所以必须显示调用析构函数(STL的 destroy 函数就是这么处理placement new 的)即可。如:p2w->~point2w(); p2w = new(arena) point2w; 

  1. C++中类似 T c = a + b,编译器优化后不会产生临时对象,但是赋值语句 c = a + b,不能够忽略临时对象,因为该表达式期待左端有一次析构操作,所以左端必须先析构,此时的 a + b 的结果会用 __temp0 来保存,左端完成析构后,再进行赋值。
  2. 在一个表达式中(比如各种与或非),临时对象的摧毁,应该是对完整表达式求值过程中的最后一个步骤。
  3. 临时对象的销毁有两个特例:
    1. 临时对象作为赋值语句的右值,必须等到左值对象初始化完成后才销毁(此时会进行拷贝构造)。
    2. 临时对象被引用绑定了,那么它的销毁会知道引用的生命结束,或者直到临时对象的生命周期结束——视哪种情况先到达而定。


附录:
有关定位 new 的知识,来自知乎:
作者:蓝色
如果你是在placement new上面工作,你如果delete以后,你也把placement new上面的内存释放了,这往往不是你想要的结果。举个例子:
Point* p = new (arena) Point;
// do something
// manipulate a new object
delete p; // Wrong. You release the arena memory
p = new (arena) Point;

// correct method

p->~P();
p = new (arena) Point;
而这里,你说有没有placement delete?placement delete expression是绝对没有的东西。但是有一个placement deletefunction,而不是placement delete expression。而这个placement delete function是你直接调用不到的东西。当placement new expression调用placement new function,如果构造函数函数构造的时候发生了异常,这个时候要防止内存泄露,那么要清理掉已分配的内存,就需要这个placement delete function。而这个东西的定义你可以打开<new>头文件看到。

但是,暴露出来的delete expression却只有两个出来: 也就是用于非数组与数组的delete。也就是用于非数组与数组的delete。

接下来举一个例子来说明一下这个构造函数发生异常的时候,调用placement delete function的情况:
#include <cstdlib>
#include <iostream>

struct A {} ;
struct E {} ;

class T 
{
public:
    T() { throw E() ; }
} ;

void * operator new ( std::size_t, const A & )
    {
        void* nothing = 0;
        std::cout << "Placement new called." << std::endl;
        return nothing;
    }
void operator delete ( void *, const A & )
    {
        std::cout << "Placement delete called." << std::endl;
    }

int main ()
{
    A a ;
    try {
        T * p = new (a) T ;
    } catch (E exp) {std::cout << "Exception caught." << std::endl;}
    return 0 ;
}


结果如下:




GNSS接收机性能测试全攻略:从实验室到真实场景 本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。 阅读详情

相关推荐

win x64下安装oracle 12c出现[INS-30131]报错的解决方案

问题:  win x64下安装oracle 12c出现[INS-30131]报错的解决方案 安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。   操作 - 请确保当前用户具有访问临时位置所需的权限。   附加信息:  - 所有节点上的框架设置检查都失败  

一条道走到黑的GISer 1348

三部曲深剖C++类与对象——下篇

运算符重载🤔运算符复用🤔前置后置运算符🤔const 带你一命通关C++基础语法

qq_61500888的博客 3465

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

《深度探索C++对象模型》笔记目录

读书笔记,特此记录。 😇😇😇 《深度探索C++对象模型》阅读笔记 第一章 关于对象 《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学 《深度探索C++对象模型》阅读笔记 第三章 Data语意学 《深度探索C++对象模型》阅读笔记 第四章 Function语意学 《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学 《深度探索C++对象模型》阅读笔记 第六章 执行期语意学 《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端...

哇咔咔的博客 364

PostgreSQL向量数据插件--pgvector安装(附PostgreSQL安装)

本文为本人在安装pgvector中踩过的坑,已找到解决方法,现向大家分享。

m0_62627802的博客 2万+

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

问答学习《深度探索C++对象模型》系列

经过数次翻看《深度探索C++对象模型》和翻看别人的笔记,还是决定自己动手写一下该本书的笔记。笔记采用问答的方式是因为在UC实习时我的指导老师的影响:你不要为了看书而看书,你要从中学到东西就要带着疑问去学习。于是有了这一系列的笔记,感谢我的指导老师让我明白:生命不息,学习不止。 第一章:《深度探索C++对象模型》读书笔记之关于对象 第二章:《深度探索C++对象模型》读书笔记之构造函数语意学 第

冰枫的随笔 1336

手把手教你学SOC芯片架构--NoC(片上网络,Network on Chip)全方位解析

​、​。

MHD0815的博客 872

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

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

fox1987的专栏 957

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 444

uni-app开发-第3篇:uni-app 页面与路由

本文详细介绍了 uni-app 中的页面开发与路由管理。首先,页面是应用的基础单元,创建页面时需在pages目录下新建文件夹和.vue文件,页面结构由<template>、<script>和<style>三部分组成。uni-app 页面生命周期函数包括onShow、onReady、onHide和onUnload,分别用于处理页面显示、渲染完成、隐藏和卸载时的逻辑。其次,路由管理通过pages.json文件配置页面路径和样式,并提供uni.navigateTo等方法进行路由

无 417

《深度探索C++对象模型》读书笔记:第6章 执行期语意学

6.1 对象的构造解构 destructor会被放在对象被构造出来以后的每一个离开点(当object还存活),如每一个return。所以尽量将object放在使用它的那个区段附近。可以节省不必要的对象产生操作和摧毁操作。 全局对象 Matrix identity; int main() { Matrix m1=identity; return 0; } identity...

junya_zhang的博客 283

ArcGIS实验教程——实验十九:网络分析(最短路径实现)

一、实验描述 网络分析模块用于实现基于网络数据集的网络分析功能,包括路径分析、服务区分析、最近设施点分析、OD成本矩阵分析、多路径配送分析、位置分配分析和高级网络的管理与创建等。 网络数据集不同于几何网络,是一种高级的连接模型,能够展示复杂的细节,拥有丰富的网络属性模型,可以模拟网络阻力、网络限制以及网络层次等。 本实验重点演示网络分析中最短路径的实现过程。 二、实验内容 1、网络数据集...

智慧空间实验室 5685

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

第六章 执行期语意学 一、对象的构造与解构 1.全局对象 Matrix identity; main() { //identity必须在此处被初始化 Matrix m1=identity; ... return 0; } C++保证,一定会在main()函数中第一次用到identity之前,把identity构造出来,而在main()函数结束之前把identity摧毁掉。像identity这样的所谓全局对象,如果有构造函数和析构函数的话,就说它需要静态的...

Estelle 325

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《深度探索c++对象模型》笔记

《深度探索c++对象模型》第一章笔记:《深度探索c++对象模型》第一章笔记_StudyWinter的博客-优快云博客《深度探索c++对象模型》第二章笔记:《深度探索c++对象模型》第二章笔记_StudyWinter的博客-优快云博客《深度探索c++对象模型》第三章笔记:《深度探索c++对象模型》第三章笔记_StudyWinter的博客-优快云博客《深度探索c++对象模型》第四章笔记:《深度探索c++对象模型》第四章笔记_StudyWinter的博客-优快云博客《深度探索c++对象模型》第五章笔记:《

StudyWinter的博客 616

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

一.C++对象模型(The C++ Object Model) 在C++中有两种成员数据:static data members(静态) 以及non-static data members(普通非静态); 三种成员函数:static member function(静态成员函数), non-static member function(一般非静态成员函数)以及virtual member f...

weixin_44071945的博客 178

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

第六章:执行期语意学6.1 对象的构造和解构a) 全局对象b) 局部静态对象    记住局部静态对象的constructor和destructor只被执行一次。int function() { static int i; //只被初始化一次 i++; return i; }c) 对象数组如果一个class有一个自定义的default constructor,那么类似于Point array[10]; 的时候,一个函数会被调用:void* vec_new( void

cesc 625

C++对象模型笔记:概述

本系列文章是对Lippman的《深度探索c++对象模型》(“Inside the c++ object model”)的读书笔记。1、关于作者Lippman:c++首个编译器的开发者之一,所作的c++方面的书籍有:《c++ primer》:c++的百科全书,和c++之父的《c++ programming language》齐名。《Inside the c++ object model》:讲述c++

jiangnanyouzi的专栏 1472

[读书笔记]深度探索C++模型_第六章_执行期语意学

6.1 对象的构造和析构 全局对象 一般而言我们会把 object 尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。 C++程序中所有的 global objects 都被放置程序的 data segment 中。也就是静态变量区。 局部静态对象 const Matrix&amp;amp; identity() { static Matr...

xy_cpp的博客 291

【读书笔记】《Effective Modern C++》第八章 Treaks

本章围绕“微调”的两个建议,着眼于优化函数参数传递与容器操作这两个频繁操作的细节层面。条目建议Item 41对于总是被拷贝、可高效移动的参数,考虑按值传参Item 42优先使用emplace族函数,避免冗余构造和复制它们并不依赖语言新特性,却体现出对代码性能与可读性的深度考量。在代码设计已趋稳定的阶段,这类“微小优化”往往成为衡量代码精致程度的重要标志。

YZJincsdn的博客 784

《C++ Primer》学习笔记/习题答案 总目录

文章目录前言专栏C++学习笔记目录第一章 - 快速入门第二章 - 变量和基本类型第三章 - 标准库类型第四章 - 数组和指针第五章 - 表达式第六章 - 语句第七章 - 函数第八章 - 标准 IO 库第九章 - 顺序容器第十章 - 关联容器第十一章 - 泛型算法第十二章 - 类第十三章 - 复制控制第十四章 - 重载操作符与转换第十五章 - 面向对象编程第十六章 - 模板和泛型编程第十七章 - 用...

种树最好的时间是10年前,其次是现在!!! 4万+

计算机读书笔记

应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。当表达式中存在有符号数和无符号数类型时,所有的操作都自动转换为无符号类型。可见无符号数的运算优先级高于有符号数。无符号数转换为有符号数时,对于小的数将保持原值,对于大的数将转换为负数,相当于原值减去2的n次方。有符号数转换为无符号数时,负数转换为大的正数,相当于在原值上加上2的n次方,而正数保持不变。无符号整数和有符号整数之间进行强制类型转换时,位模式不改变。相邻的字符串常量将会自动合并成一个字符串。

最佳损友1020的博客 2522

剑指offer读书笔记:第六章,面试中的各项个能力01

问题01 数字在排序数字中的数量 最笨的方法使用Map统计遍历,但是题目是有序数组,所以必然是二分查找,可以去寻找key的上一个元素和下一个元素,时间都是O(lon(n)),然后计算范围即可。 问题02 二叉树的深度 这个实在是太简单了,直接DFS深度优先遍历即可 问题03 数组中只出现一次的数字 先考虑一个数组里只有一个数出现一次,其他两个数都出现两...

JackZhangNJU的专栏 366

大话数据结构第六章读书笔记:树(1)

1.基本概念 结点的度:结点拥有的子树的个数 2.树的存储结构 树的存储结构在C++中有:双亲表示法、孩子表示法、孩子双亲表示法、孩子兄弟表示法 但自己当转化为java程序时,却发现这些表示法在java中没有区别,不知道是不是自己理解错了 以下给出结点的程序: package tree; public class PTNode&lt;T extends Comparable&lt;...

qq_23726109的博客 226

好语言,就该善用它——《C++语言的设计与演化》读书笔记

  C++真是让人又爱又恨的语言之一。很多人都说C++功能强大,其实很多时候他们都是足够幸运的,没有遇到太多需要用代码杂技解决的需求,或者没有亲身维护太多充满“高技巧”的代码的项目。我都遇到过,所以最后终于决定把Java当作自己的第一语言。C++作为以爱好为主的研究语言了。   从2004年开始,我就陆续看了一些C++语言的书。学完C语言后,觉得它在某写领域过于中...

weixin_33830216的博客 99

《C++ Primer 4th》读书笔记 第6章-语句

原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912407.html 转载于:https://www.cnblogs.com/DayByDay/p/3912407.html

weixin_34358092的博客 83
上一篇: 动态内存管理详解:malloc/free/new/delete/brk/mmap
下一篇: 《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值