79 C++对象模型探索。数据语义学 - 进程内存空间布局分析

不同的数据在内存中会有不同的保存时机,和保存位置,这一节就分析这个。

当运行一个可执行文件时候,操作系统就会把这个可执行文件加载到内存;此时进程有一个虚拟的地址空间(内存空间),如下图:

代码段:装的代码

数据段,BSS段:更准确的说法是:数据段中一块是BSS段。他们两个的地址分配是有一些区别的。

数据段(.data):存储的是全局变量 和静态变量,一般是已经初始化的全局变量

BSS段:存储的是全局变量 和 静态变量 ,但是一般这个全局变量没有初始化,或者是默认给的0,"" ,nullptr

堆:

//中间空间

栈:

搞一段代码验证一下:

// 这里研究 数据段-存储的是全局变量,一般是已经初始化的全局变量
//          BBS段 - 存储的是全局变量,但是一般这个全局变量没有初始化,或者是默认给的0,"", nullptr
int *ptest = new int(120);
int g1;
int g2;
int g3 = 12;
int g4 = 32;

int g5;
int g6 = 0;

static int g7;
static int g8 = 0;
static int g9 = 10;

void mygfunc() {
	return;
}

class Teacher3 {
public:
	int m_i;
	static int m_si;//这里是声明一个static,并不是定义,声明不会分配空间
	int m_j;
	static int m_sj;
	int m_k;
	static int m_sk;
};

int Teacher3::m_si = 0;//这里才是定义,才会分配空间
void main() {

	//打印所有的地址,观察地址空间

	printf("ptest 的地址 %p\n", &ptest);
	printf("g1 的地址 %p\n", &g1);
	printf("g2 的地址 %p\n", &g2);
	printf("g5 的地址 %p\n", &g5);
	printf("g6 的地址 %p\n", &g6);
	printf("g3 的地址 %p\n", &g3);
	printf("g4 的地址 %p\n", &g4);
	printf("g7 的地址 %p\n", &g7);
	printf("g8 的地址 %p\n", &g8);
	printf("g9 的地址 %p\n", &g9);
	printf("Teacher3 静态成员m_si 的地址 %p\n", &(Teacher3::m_si));
	//printf("Teacher3 静态成员m_sj 的地址 %p\n", &(Teacher3::m_sj)); build error
	printf("全局方法 mygfunc() 的地址 %p\n", mygfunc);
	cout << "用C++的方式打印:全局方法 mygfunc() 的地址" << (void *)mygfunc << endl;
	printf("main 方法 的地址 %p\n", main);

	//  ptest 的地址 00AF4318 //有初始化的全局变量,BSS
	//	g1 的地址 00AF42E8   //没有初始化的全局变量  BSS
	//	g2 的地址 00AF42EC  // 没有初始化的全局变量 BSS
	//	g5 的地址 00AF42F0 // 没有初始化的全局变量  BSS
	//	g6 的地址 00AF42F4 // 初始值为0的全局变量  BSS
	//	g3 的地址 00AF4000// 有初始值的全局变量   数据段.dada
	//	g4 的地址 00AF4004 // 有初始值的全局变量  数据段.dada
	//	g7 的地址 00AF431C // 没有初始值的static  BSS 
	//	g8 的地址 00AF4320 //初始值为0的static  BSS
	//	g9 的地址 00AF4008 //初始值为10的static  数据段.dada
	//	Teacher3 静态成员m_si 的地址 00AF42F8 // 初始值为0的static

	//	//如下三个都是方法,是在代码段放置的。
	//	全局方法 mygfunc() 的地址 00AE169A
	//	用C++的方式打印:全局方法 mygfunc() 的地址00AE169A
	//	main 方法 的地址 00AE1500
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署思维导图工具SimpleMindMap并实现公网远程访问

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

03_2 连续时间信号的傅里叶变换(FT) 非周期信号的傅里叶变换

各位看官&#xff0c;大家好&#xff01;本讲为《数字信号处理理论篇》03_2 连续时间信号的傅里叶变换 非周期信号的傅里叶变换。&#xff08;特别提示&#xff1a;课程内容为由浅入深的特性&#xff0c;而且前后对照&#xff0c;不要跳跃观看&#xff0c;请按照文章或视频顺序…

《30天自制操作系统》 第一周(D1-D7) 笔记

前言&#xff1a;这是我2023年5月份做的一个小项目&#xff0c;最终是完成了整个OS。笔记的话&#xff0c;只记录了第一周。想完善&#xff0c;却扔在草稿箱里许久。最终决定&#xff0c;还是发出来存个档吧。 一、汇编语言 基础指令 MOV: move赋值&#xff0c;数据传送指令…

nginx复现负载均衡案例

这里是下载好了docker&#xff0c;并显示了下镜像这里是拉到了nginx的镜像这里是把容器起来&#xff0c;-itd是容器关闭后销毁这里是显示起来的容器进入到这个容器里面查看许多命令用不了&#xff0c;应该想办法把docker里的文件夹映射到物理机中 这里是如果访问6666端口那么隧…

常见电源电路(LDO、非隔离拓扑和隔离拓扑结构)

一、常见电路元件和符号 二、DC-DC转换器 DC-DC转换器&#xff1a;即直流-直流转换器&#xff0c;分为三类&#xff1a;①线性调节器&#xff1b;②电容性开关解调器&#xff1b;③电感性开关调节器&#xff1b; 2.1线性稳压器&#xff08;LDO&#xff09; 2.1.1 NMOS LDO…

UI自动化定位元素之js操作

前言 在UI自动化测试中&#xff0c;元素定位是一个至关重要的步骤。准确地定位到页面上的元素&#xff0c;是实现自动化测试的前提和保障。本文将介绍使用JavaScript进行元素定位的常见方法&#xff0c;并分析页面的组成&#xff0c;帮助读者更好地理解和应用元素定位技术。 页…

Oracle RAC 集群的安装(保姆级教程)

文章目录 一、安装前的规划1、系统规划2、网络规划3、存储规划 二、主机配置1、Linux主机安装&#xff08;rac01&rac02&#xff09;2、配置yum源并安装依赖包&#xff08;rac01&rac02&#xff09;3、网络配置&#xff08;rac01&rac02&#xff09;4、存储配置&#…

深度强化学习(王树森)笔记01

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

网安渗透攻击作业(1)

实现负载均衡 第一步&#xff1a;安装依赖 sudo apt insta11 libgd-dev 第二步&#xff1a;下载nginx wget http://nginx.org/download/nginx-1.22.1.tar.gz 第三步&#xff1a;对nginx进行解压 tar -zvxf nginx-1.22.1.tar.g2 第四步&#xff1a;编译安装nginx cd ngi…

短剧小程序分销系统开发:创新与机遇的融合

一、引言 随着移动互联网的快速发展&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;正逐渐成为人们生活中的一部分。短剧小程序分销系统的开发&#xff0c;不仅为短剧的传播提供了新的渠道&#xff0c;同时也为相关产业带来了新的商业机会。本文将探讨短剧小程序分销系统…

【JavaEE】网络原理: 网络编程套接字(概念)

目录 1.什么是网络编程 2.网络编程中的基本概念 2.1发送端和接收端 2.2请求和响应 2.3客户端和服务端 3.Socket套接字 4.Socket编程注意事项 1.什么是网络编程 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信 (…

PVE更换LXC源教程,如何在PVE上使用LXC容器

PVE更换LXC源教程&#xff0c;如何在PVE上使用LXC容器 Proxmox Virtual Environment (PVE) 是一种基于开源的虚拟化平台&#xff0c;它允许您轻松地在单个物理服务器上管理和部署虚拟机和容器。其中的LXC容器是一种轻量级容器化技术&#xff0c;可提供更高的性能和资源利用率。…

python连接sqlserver

1、安装sqlserver 用的是sqlserver2012的版本 网上很多&#xff0c;参考下 https://blog.csdn.net/weixin_44889709/article/details/123769722 2、安装python3.7及以下环境 尝试安装python3.8的环境不能连接成功 conda create -n pytorch python3.73、安装sqlserver的pyt…

Dijkstra算法-lanqiao1122

#include <bits/stdc.h> using namespace std; const long long INF 0x3f3f3f3f3f3f3f3fLL; const int N 3e5 5; struct edge{int from, to;//边&#xff1a;起点&#xff0c;终点&#xff0c;权值&#xff1b;起点from没有用到&#xff0c;e[i]的i就是fromlong long …

JUC-synchronized无锁、偏向锁、轻量级锁、重量级锁

1 synchronized实操 关键字synchronized可以用来保证多线程并发安全的**原子性、可见、有序性。**关键字synchronized不仅可以作用于方法还可以作用于同步代码块&#xff0c;能够保证作用范围中线程访问安全。 注意&#xff1a;局部变量是线程安全的。线程不安全问题只存在于实…

excel中多行合并后调整行高并打印

首先参考该文&#xff0c;调整全文的行高。 几个小技巧&#xff1a; 1.转换成pdf查看文件格式 2.通过视图--》分页预览&#xff0c;来确定每页的内容&#xff08;此时页码会以水印的形式显示&#xff09; 3. 页面布局中的&#xff0c;宽度可以选为自动&#xff0c;因为已经是…

ASP.NET 7 Core Web 读取appsetting.json

把一些配置信息保存在json文件可以避免更改时要重新发布程序的烦恼。 我这里使用的是写一个类文件&#xff0c;然后通过program.cs启动的方式&#xff08;.net 6 开始没有startup了&#xff09;。 项目类型&#xff1a;ASP.NET Core Web MVC / .NET 7.0 / VS2022 第一步…

苹果提审被拒反馈崩溃日志.text | iOS 审核被拒crashLog

iOS审核人员拒绝后每个截图&#xff0c;只给了几个text文件&#xff0c;这种情况就是审核的时候运行你的代码&#xff0c;崩溃了。 仅仅看text文件&#xff0c;是看不出所以然来的&#xff0c;所以我们要将日志转换成.crash格式 1.将.text文件下载下来&#xff0c;将 .text手动…

OpenHarmony关系型数据库

1 概述 关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库&#xff0c;是在SQLite基础上提供一套完整的对本地数据库进行管理的机制&#xff0c;为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口&#xff0c;同时开发者也…

算法笔记:地理探测器

1 空间分层异质性&#xff08;spatial stratified heterogeneity&#xff09; 空间分层异质性&#xff08;空间分异性/区异性&#xff09;&#xff1a;层内方差小于层间方差的地理现象例如气 候带、土地利用图、地貌图、生物区系、区际经济差异、城乡差异以及主体功能区等 等[…