【黑马程序员】程序的内存模型

news2025/1/18 14:45:47

文章目录

  • 内存分区模型
    • 分区意义
    • 代码区
    • 全局区
      • 特点
      • 代码示例
    • 栈区
      • 特点
      • 代码示例
    • 堆区
      • 特点
      • 代码示例
    • new 操作符

20240209

内存分区模型

分区意义

  • 不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

代码区

  • 处于程序未执行之前

  • 程序编译后生成的可执行程序

  • 存放函数体的二进制代码,存放CPU执行的机器指令,由操作系统进行管理

  • 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

  • 代码区是只读的,只读的原因是防止程序意外的修改了它的指令

全局区

特点

  • 处于程序未执行之前

  • 存放全局变量和静态变量

  • 全局区包含了常量区,字符串常量和其它常量也存放在此

  • 该区域的数据在程序结束后由操作系统释放

代码示例

  • 代码
#include <iostream>

using namespace std;

// 全局变量
int g_a = 20;
int g_b = 10;
// 全局常量
const int c_g_a = 10;
const int c_g_b = 10;

int main(){

	// 局部变量
	int a = 10;
	int b = 10;
	// 静态变量, 在局部变量前面加上static关键字
	static int s_a = 10;
	static int s_b = 10;
	// 局部常量,在局部变量前面加上const关键字
	const int c_a = 10;
	const int c_b = 10;
	cout << "局部变量a的地址是:" << &a << endl;
	cout << "局部变量b的地址是:" << &b << endl;
	cout << "静态局部变量a的地址是:" << &s_a << endl;
	cout << "静态局部变量b的地址是:" << &s_b << endl;
	cout << "局部常量c_a的地址是:" << &c_a << endl;
	cout << "局部常量c_b的地址是:" << &c_b << endl;
	cout << "字符串常量hello的地址是:" << &("hello") << endl;
	cout << "全局变量g_a的地址是:" << &g_a << endl;
	cout << "全局变量g_b的地址是:" << &g_b << endl;
	cout << "const修饰的全局常量c_g_a的地址是:" << &c_g_a << endl;
	cout << "const修饰的全局变量c_g_b的地址是:" << &c_g_b << endl;
	return 0;
}
  • 运行结果,在内存中的存放位置,通过地址可以看到存储的远近

在这里插入图片描述

栈区

特点

  • 处于程序运行后

  • 由编译器自动分配释放,存放函数的参数值,局部变量等

  • 注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

代码示例

#include <iostream>

using namespace std;

int * func(int b) {	// 形参存放在栈区
	int a = 10;	// 局部变量存放在栈区
	return &a;	// 返回局部变量地址
}

int main(){
	int *p = func(1);
	cout << *p <<endl;	// 第一次可以打印正确数字是因为编译器做了保留
	cout << *p <<endl;	// 第二次就会返回乱码
	return 0;
}

堆区

特点

  • 由程序员自己分配释放,若不释放,程序结束时,由操作系统回收

  • 在C++中主要利用new在堆区开辟内存

代码示例

#include <iostream>

using namespace std;

int * func() {
	// 利用new关键字可以将数据开辟到堆区
	// 指针p是局部变量放在栈上,指针保存的数据是放在堆区
	int *p = new int(10);
	return p;
}

int main() {
	// 在堆区开辟数据
	int *p = func();
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	return 0;
}

new 操作符

  • c++ 利用new操作符在堆区开辟数据

  • 堆区开辟的数据由程序员手动释放,释放利用操作符delete

  • 语法:new 数据类型

  • 利用new创建的数据,会返回改数据对应类型的指针

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 安装 Linux子系统,并为子系统设置图形化界面

安装WSL 在控制面板中打开下面的选项&#xff1a; 执行下面的命令&#xff0c;更新到WSL2版本&#xff0c;并在以后创建子系统的时候默认采用WSL2的版本&#xff1a; wsl --update wsl --set-default-version 2在Window上安装连接工具&#xff1a; 在Window上下载VcXsrv&…

4.0 Zookeeper Java 客户端搭建

本教程使用的 IDE 为 IntelliJ IDEA&#xff0c;创建一个 maven 工程&#xff0c;命名为 zookeeper-demo&#xff0c;并且引入如下依赖&#xff0c;可以自行在maven中央仓库选择合适的版本&#xff0c;介绍原生 API 和 Curator 两种方式。 IntelliJ IDEA 相关介绍&#xff1a;…

Open CASCADE学习|求圆的切线与切点

在几何学中&#xff0c;一个圆的切线被定义为与圆相切于一点的直线&#xff0c;而该点被称为切点。这意味着切线在切点处与圆仅有一个交点&#xff0c;并且在该点处&#xff0c;切线的方向与圆的半径垂直。 以下是关于圆的切线和切点的一些重要性质&#xff1a; 切线与半径的…

在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程

一、前期准备&#xff1a; 1.安装VMware 虚拟机软件&#xff08;不在讲解&#xff0c;可自行去下载安装&#xff09;。官网&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-PLAYER-1750&productId1377&rPId111471 2.下载iso…

【Langchain Agent研究】SalesGPT项目介绍(一)

【2024最全最细LangChain教程-13】Agent智能体&#xff08;二&#xff09;-CSDN博客 之前我们介绍了langchain的agent&#xff0c;其实不难看出&#xff0c;agent是更高级的chain&#xff0c;可以进行决策分析、可以使用工具&#xff0c;今天我们开始开启一些更高阶的课程&…

mysql 中文编码问题

前言 最近在学springboot整合mybatisplus技术&#xff0c;用到mysql数据库&#xff0c;然后发现在windows下插入数据表会出现中文乱码现象 (例如 “我是谁” 在数据库中就成了 “???”) windows show variables like %char%;建表时, 设置默认charset为gbk create table u…

LayUI中表格树折叠 --

1、先将插件源码进行下载&#xff0c;新建 tableTree.js 文件&#xff0c;将源码放进去 2、将 tableTree.js 文件 配置之后&#xff0c;在需要使用的页面进行引入&#xff1a; layui.define(["tableTree"],function (exports) {var tableTree layui.tableTree;// …

Mac上几款好用的MacBook视频播放器

使用Mac电脑时&#xff0c;视频播放器可以说是我们使用频率最高的软件之一了&#xff0c;不管是工作时看视频资料还是在家里看下载好的电影&#xff0c;都需要用到视频播放器&#xff0c;本文中我们就来推荐几款好用的Macbook视频播放器&#xff0c;总有一款适合你&#xff01;…

OpenSSL 创建自签名证书

前言 Openssl 是一个方便的实用程序,用于创建自签名证书。您可以在所有操作系统(如 Windows、MAC 和 Linux 版本)上使用 OpenSSL。 自签名证书 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)创建服务器私钥以生成 CSR使用我们的根 CA 和 CA 私钥创建具有 CSR 的…

vue3-内置组件-Teleport

Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 基本用法 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看…

如何通过ETL实现快速同步美团订单信息

一、美团外卖现状 美团作为中国领先的生活服务电子商务平台&#xff0c;其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步&#xff0c;但由于数据量庞大且来源多样化&#xff0c;传统的手动处理方式效率低下&#xff0c;容易出错。比如&#…

盒子模型...

一&#xff0c;盒子模型 1.1网页布局的本质 1先准备好相关的网页元素&#xff0c;网页元素基本都是盒子BOX。 2利用CSS设置好盒子样式&#xff0c;然后摆放到相应位置。 3往盒子里面装内容。 1.2盒子模型 CSS盒子模型本质是一个盒子&#xff0c;封装周围的HTML元素&#xff…

结构体的大小以及内存对齐问题

结构体的大小怎么计算&#xff1f;什么是结构体的对齐&#xff1f; 首先想要直到结构体的大小需要先了解结构体的内存对齐。那么&#xff0c;什么是结构体的内存对齐&#xff1a; 什么是结构体内存对齐 结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结…

【开源】SpringBoot框架开发校园电商物流云平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

unity——ScriptableObject相关知识点【学习笔记/不足之处欢迎斧正/个人复习向/侵删】

一、相关简介 1.ScriptableObject是什么&#xff1a;Unity提供的一个数据存储基类 2.ScriptableObject的好处有哪些&#xff1a;文件配置、数据复用、更好的处理数据带来的多态性为 二、ScriptableObject的创建 1.自定义ScriptableOject数据容器 继承ScriptableObject类 在…

[BeginCTF]真龙之力

安装程序 双击安装 出现了安装失败的标签&#xff0c;开发者不允许测试。 查看Mainfest入口文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" android:versionCo…

Blender_pmx导出fbx

Blender_pmx导出fbx 学无止境&#xff1f; 相关链接&#xff1a; Blender教程&#xff1a; Blender中文手册介绍 — Blender Manualhttps://docs.blender.org/manual/zh-hans/2.79/about/introduction.htmlhttps://www.blendercn.org/https://www.blendercn.org/Blender下载…

dddddddddddddddddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

深度学习(13)--PyTorch搭建神经网络进行气温预测

一.搭建神经网络进行气温预测流程详解 1.1.导入所需的工具包 import numpy as np # 矩阵计算 import pandas as pd # 数据读取 import matplotlib.pyplot as plt # 画图处理 import torch # 构建神经网络 import torch.optim as optim # 设置优化器 1.2.读取并处理数据…