【C++】深度探索C++对象模型之执行期语意学

使用R语言获取data.frame中指定列的数据 这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。 阅读详情

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


一、对象的构造和析构

对于类对象的构造,我们应该尽量在需要使用时才进行定义,一般在定义之后则开始内部的构造过程。

而对于已构造的对象,其析构函数必须放在每一个离开点(当object还存在)之前。


二、全局对象

对于全局变量,C++会保证在调用全局变量之前,将全局变量构造出来。
而所有的全局变量都被放置在程序的数据段中(data segment),并且为没有显示指定值的变量初始化为0.
同时对于全局的类对象,在编译时期被放置于data segment中并且内容也为0.只有在程序启动时其对应的constructor才会实施。因此object需要静态初始化。
静态初始化的munch策略:
  • 为每个需要静态初始化的文件产生一个_sti()函数,内含必要的constructor调用操作和inline expansions。
  • 为每一个需要静态的内存释放操作的文件,产生一个_std()函数。
  • 提供一个_main()函数调用所有的_sti()函数,一个_exit()函数调用所有的_std()函数

三、局部静态对象

局部静态对象的constructor只能被施行一次,destructor也只有一次。
所以对于局部静态对象,一个很简单的思路就是导入一个临时性对象,当第一次传入时,设置为true,之后则不再进行处理。
条件式析构也是所有编译器所必须的,而static local class object需以构造的相反的顺序被析构。

四、对象数组

对于以下数组定义:
Point knots[ 10 ];
我们一般使用vec_new()函数来构造数组(这是在cfront中的方式), 对于VS等,则提供一个用来处理没有"virtual base class"的class,另一个用来处理"内含virtual base class"的class。后一个函数通常称为 vec_vnew()。函数的原型一般如下:
void *
vec_new( 
    void *array,                       // 数组的起始地址
    size_t elem_size,                  //每一个class object大小
    int elem_count,                    //数组中的元素个数
    void (*constructor)(void *)        //类的constructor函数指针
    void (*destructor)(void *, char)   //类的destructor函数指针
所以对上述的Point对象的初始化,对应的vec_new()的实例化如下:
vec_new( &knots, sizeof(Point), 10, &Point::Point, 0);
同理,对于对象的删除,也有类似的vec_delete()来进行操作。
void *
vec_new( 
    void *array,                       // 数组的起始地址
    size_t elem_size,                  //每一个class object大小
    int elem_count,                    //数组中的元素个数
    void (*destructor)(void *, char)   //类的destructor函数指针

五、new和delete运算符

int *pi = new int(5);
其实是通过两个步骤完成的,第一步通过适当的new运算符函数实例,配置所需的内存,然后将配置来的内存设定初值。
使用pi,和使用pi所指的对象,其差别在于哪一个生命已经结束了。因为即使对象不合法,但是指针所指的对象也是合法的。
new其实是通过标准的c malloc完成的,每一次对new的调用必须传回一个独一无二的指针,指向默认1byte的内存地址。
如果类对象数组没定义constructor和destructor,则不会调用vec_new。
对于delete[] p_array, 只有中括号出现时,编译器才会寻找数组的维度,否则他只会假设单独的一个object要被删除。
那么如何记录数组的元素个数呢?一个明显的方法是为vec_new()所传回的每一个内存区域块设置一个额外的word,然后把元素个数包藏在那个word之中。而包藏的数值通常称为cookie。
在原始编译器中,有两个主要函数用来存取cookie

注意,避免一个base class指针指向一个derived class object所组成的数组。即
Point *ptr = new Point3d[10];
如果一定要这样做,默认情况下只会交给施行vec_delete()函数的”被删除之指针类型的destructor“,也就是Point destructor。
所以,需要程序员如下显著的进行释放内存。
for(int ix = 0; ix < elem_count; ++ ix) {
    Point3d *p = &((Point3d*)ptr)[ix];
    delete p;
}

六、关于placement Operator new
这是一个预先定义好的重载的new运算符,调用方式如下:
Point2w *ptw = new (arena) Point2w
其中arena是指向内存的一个区块,用以放置产生的Point2w object。
这样写的一个好处就是,Placement new operator所扩充的另一半是将Point2w constructor自动施行于arena之上:
Point2w *ptw = (Point2w*) arena;
if(ptw != 0)
    ptw->Point2w::Point2w();
所以Placement new operator的好处就是决定object放在那里,并在此地施行constructor。
#include <iostream>
#include <typeinfo>

using namespace std;

class Point {
public:
    Point(int x, int y) : _x(x), _y(y) {};
    void test() { cout << "hello word:" << _x << _y << endl;}
    ~Point(){ cout << "destructor" << endl; };

protected:
    int _x, _y;
};


int main()
{
    char *arena = new char[sizeof(Point)];
    Point *pt = new (arena) Point(1, 3);
    pt->test();
    //delete pt;
    pt->~Point();
    pt = new (arena) Point(2, 3);
    pt->test();
    cout << (pt != nullptr) << endl;
    return 0;
}


关于placement的正确方法:
p2w->~Point2w;
p2w = new (arena) Point2w;

七、临时性对象

临时性对象的摧毁,应该是对完整表达式求值过程中最后一个步骤。该完整表达式造成临时对象的产生。
凡持有表达式执行结果的临时对象,应该保留到object的初始化操作完成为止。
如果一个临时对象被绑定于一个reference,对象将残留,直到初始化之reference生命结束,或直到临时对象的什么范畴结束。








CVE-2021-22205 GITLAB 未授权 RCE 漏洞 简介 GitLab是由GitLab Inc.开发的一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,可通过Web界面访问公开或私人项目。由于GitLab存在未授权的端点,导致该漏洞在无需进行身份验证的情况下即可进行利用。 漏洞利用 上工具 python3 poc import sys import requests from bs4 import BeautifulSoup requests.packages.urllib3.disable_warnings() def . 阅读详情

相关推荐

CPRI原理及应用--基本原理

本文主要介绍CPRI的基本原理,包括CPRI的发展历程、CPRI基本协议、速率、帧结构、时延模型等

u014035968的博客 2万+

c++对象模型

一、什么是c++对象模型 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 二、c++对象的布局成本 成员函数不占用成本 member functions虽然再class的声明之内,却不在object之中。每一个non-inline member function只会诞生一个函数实例。 每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实例。 c++在布局以及存取时间上主要的额外负担是由virtual引起的 virtual

gb173652770的专栏 2269

python:numpy分享(保姆级教程)

创建数组:array和ndarray、rand()、randn()、arange()、randint()、uniform()astype()基础函数:ceil()、floor()、rint()、argmax()、argmin()、cumsum()、cumprod()numpy 是数据分析必不可少的第三方库,具有高性能的特点,多用于做数组分析。内置函数:ceil()、floor()、rint()主要用于数组计算,支持多维数组。array和ndarray。比较函数:all、any。去重函数:unique。

sulin123123的博客 1728

C++对象模型详解

C++对象模型详解 原文链接:吴秦大神的C++对象模型。 何为C++对象模型? C++对象模型可以概括为以下2部分: 1、语言中直接支持面向对象程序设计的部分; 2、对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,如构造函数、析...

dichuangheng8094的博客 605

支付宝H5支付唤醒协议全解析:从alipays://到动态orderSuffix的抓取与拼接

本文深入解析支付宝H5支付唤醒协议,从alipays://协议设计到动态orderSuffix参数的抓取与拼接,详细介绍了支付宝H5支付的底层机制。内容包括协议架构剖析、动态令牌生成与捕获、浏览器兼容性解决方案以及安全机制设计,为开发者提供全面的技术指南和实践建议。

weixin_27972919的博客 3481

手把手教你用Python处理MAHNOB-HCI多模态数据集(含脑电EEG/眼动/视频数据同步实战)

本文详细介绍了如何使用Python处理MAHNOB-HCI多模态数据集,涵盖脑电(EEG)、眼动追踪和视频数据的同步解析与对齐。通过MNE-Python、pandas和OpenCV等工具,实现从BDF、TSV到XML格式的高效处理,解决时间轴对齐难题,助力情感计算与人机交互研究。

weixin_30998797的博客 367

深度探索C++ 对象模型

深度探索C++ 对象模型 第二章 对象 第二章第一节 类对象所占用的空间 成员函数不占用类对象的内存空间一个类对象至少占用1个字节的内存空间成员变量是占用对象的内存空间成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象; 第二章第二节 对象结构的发

weixin_42252757的博客 1173

AI辅助专利撰写实战:用Codex 30分钟生成发明专利初稿

这次我们来看一个用 Codex 从零开始撰写发明专利的实战项目。对于技术研发人员、产品经理或初创团队来说,专利申请是保护创新成果、构建技术壁垒的关键一步。然而,撰写一份高质量的专利申请书,尤其是权利要求书和说明书,往往需要专业的法律和技术语言,耗时耗力。这个项目演示了如何利用 AI 工具 Codex,在短时间内生成一份结构完整、逻辑清晰、具备授权潜力的专利申请文件初稿。 整个过程的核心不是让 AI 完全替代专利代理人,而是将其作为强大的“技术翻译”和“内容生成”助手。它能将你的技术构思、流程图、核心算法或产

weixin_32181267的博客 412

C++对象模型(整理)

C++对象模型 1、何为C++对象模型? C++对象模型可以概括为以下2部分: ① 语言中直接支持面向对象程序设计的部分 面向对象程序设计部分:如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等。 ② 对于各种支持的底层实现机制 在C++类中有两种数据成员、三种成员函数: 两种数据成员:static、nonstatic。 三种成员函数:static、nonstatic、virtual。 代码举例说明: //base.h #pragma once #include<i

Aced96的博客 3928

Python 爬虫实战:爬取评论数据做情感分析

摘要:本文介绍基于Python的京东商品评论爬取与情感分析全流程实现。通过Requests库抓取评论数据接口,结合JSON解析获取结构化评论信息。利用SnowNLP进行中文文本情感分析,量化用户评价的情感倾向(正面/负面/中性)。结果显示正面评论占比66.3%,负面评论13.3%,关键词分析发现"卡顿""发热"是主要负面因素。该方法可应用于产品优化、品牌管理等场景,为决策提供数据支持。

2503_91057718的博客 1708

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

深度探索C++对象模型

c++对象模型语言中直接支持面向对象程序设计的部分对于各种支持的底层实现机制说白了是介绍编译器是如何支持、实现C++的面向对象机制的。如,继承、虚函数、指向class members的指针等等,编译器是如何实现的。本书C++语法基于C++95本书出版自2001年,虽然书中用到的标准早已盖棺定论,cfront编译器也早已过时,当时来看一些无法确定的标准、难以实现的技术、功能也早已实现,但是对C++对象模型的某些实现方式依然沿用至今。这本书依然不过时。

surfaceyan的博客 1825

YOLOv8集成CPCA(Combined Parallel Convolutional Attention)注意力机制模块YOLOv8深度教程

YOLOv8集成CPCA注意力模块教程摘要 本教程详细介绍了如何将YOLOv8 CPCA(Combined Parallel Convolutional Attention)注意力模块集成到YOLOv8目标检测框架中。CPCA模块结合了通道注意力和多尺度空间注意力机制,通过全局池化和双路径融合增强通道特征,并利用多尺度深度可分离卷积捕获空间上下文信息。YOLOv8 教程包含完整的实现步骤:创建CPCA模块代码、修改YOLOv8模型解析逻辑、编写自定义配置文件,YOLOv8YOLOv8YOLOv8YOLOv8

FJN110的博客 1619

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

第6章:执行期语意学 想象一下我们有下面这个简单的式子: if(yy ==xx.getValue( ))... 其中xx和yy定义为: X xx; Y yy; Class Y定义为: Class Y{ Public: Y( ); ~Y( ); Bool operator==(const Y&) const; //... }; Class X定义为: Class X{

walkerkalr的专栏 1424

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

哇咔咔的博客 364

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

1、  如何查看objectfiles中定义的函数和全局变量? 好吧,其实这个问题确实与执行期语意学有关。因为编译器需要收集每个全局变量的构造和析构函数,而其实现方式也是使用nm命令打印object file的符号表找出特定开头的名称。所以咯,答案是nm命令。(腾讯面试中,我曾遇到这个,当时没答出来T_T)   2、  operator new()、placement new()与new关键

Al_xin的专栏 922

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

如果一个区段(译注:以 { } 括起来的区域)或函数中有一个以上的离开点,情况会稍微混乱一些。Destructor必须被放在每一个离开点(当时object还存活) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象产生操作和摧毁操作,由于这样的限制,下面这些munch策略就浮现出来了: 因为静态语意保证了 mat_identity 在整个程序周期都存在,而不会在函数 identity()退出时被析构,所以:以下就是书中作者在cfront之中的做法。首先,我导人一个临

哇咔咔的博客 381

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

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

冰枫的随笔 1335

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

深度探索C++对象模型

wogan101的博客 248

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

new运算符和delete运算符 运算符new看似是一个简单的运算,比如:int *pi=new int(5);但是它实际由两个步骤完成: 1.通过适当的new运算符函数实体,配置所需的内存://调用函数库中的new运算符 int *pi=__new(sizeof(int));2.给配置得到的对象分配初值:*pi=5;(注意,上面的代码中并不包括 exception handling,是

李正浩的博客 513

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

 Inside The C++ Object ModelStanley B. Lippman 屋檐下的水滴--读书笔记系列http://blog.youkuaiyun.com/dwater 《深度探索C++对象模型》读书笔记                                                                          

DWATER 6126

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

对象的构造和析构如果一个区段或函数中有一个以上的离开点,destructor必须被放在每一个离开点之前。一般而言object应尽可能放在使用它的那个程序区附近,这样做可以节省不必要的对象产生和销毁操作。C++程序中所有的global objects都被放置在程序的data segment中。如果global object有constructor和destructor的话,它需要静态的初始化和内存释...

stt2019 235

《深度探索C++对象模型》学习笔记

《深度探索C++对象模型》学习笔记 最近学习了c++对象模型,做下笔记,方便日后查阅 第一章:关于对象 c++对象模型 在此模型中,成员变量被配置在每一个对象中,静态成员变量、成员函数和静态成员函数放置在对象之外,虚函数则以下两个步骤支持: 每个类产生一堆指向虚函数的指针放在表格之中,这个表格叫做虚函数表(vtal) 每个对象中被添加一个指针(vptr),指向相关的虚函数表,vptr的赋值和重置由每个类的构造函数、析构函数和拷贝赋值运算符自动完成。每个类所关联的type_info放在虚函数表的表头

QT练手小程序 466

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

《深度探索C++对象模型》读书笔记第六章:执行期语意学 C++在执行期的一些变化,例如临时对象的产生,临时对象的构造和析构成本是我们需要考虑的,我们将在第三节具体讲解。 一.对象的构造和析构 一般而言,我们将object尽可能放置在使用它的那个程序区段附近,这样可以节省非必要的对象的构造和析构成本。 全局对象 已经初始化全局对象均存储在data segment(数据段),未初始化...

yhcuac 564

《深度探索C++对象模型》--5 构造析构拷贝 && 6 执行期语意学

《深度探索C++对象模型》--5 构造、析构、拷贝语意学 1、纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用。 注意:pure virtual destructor一定得定义,因为每一个derivedclass destructor会被编译器加以扩张,以静态方式调用其每一个virtual base class及上一个ba

KUAILE123的专栏 1170

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

1、C++是一个不太容易从程序源码上看出表达式的复杂程度。其中会有很多的临时生成物。 2、一般而言,最好把对象尽可能放在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。如果一个区段的函数有一个以上的离开点,析构函数会被放在每一个离开点。 3、对全局对象而言,C++一定会在main函数中第一次调用对象之前把对象构造出来,而在main结束之前把对象摧毁掉。全局对象放在数据段...

一个人的学习和碎碎念 291
上一篇: 【C++】深度探索C++对象模型之类存储
下一篇: 【C++】深度探索C++对象模型之站在对象模型的顶端
小do在努力
博客等级 码龄16年 58粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值