研一寒假C++复习笔记--程序的内存模型

news2024/12/25 14:50:11

目录

1--内存分区模型

2--代码区

3--全局区

4--栈区

5--堆区

6--new操作符


1--内存分区模型

        执行C++程序时,内存可划分为4个区域,不同区域存放的数据,具有不同的生命周期;

① 代码区:存放函数的二进制代码,由操作系统进行管理;

② 全局区:存放全局变量、静态变量和常量;

③ 栈区:由编译器自动分配释放,存放函数的参数值、局部变量等;

④ 堆区:由程序员分配和释放,若程序员不释放,则在程序结束时由操作系统回收;

        代码区和全局区在程序运行前划分,栈区和堆区在程序运行时划分;

2--代码区

        代码存放 CPU 执行的二进制机器指令;

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

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

3--全局区

        全局区存放全局变量和静态变量;

        全局区包含常量区,字符串常量和其他常量存放在常量区;

        全局区的数据在程序结束后由操作系统释放;

# include <iostream>

int g_a = 1;
int g_b = 1;
const int cg_a = 1; // 全局常量
const int cg_b = 1;
int main(){
    int a = 1;
    int b = 1;
    static int s_a = 1;
    static int s_b = 1;
    const int c_a = 1;
    const int c_b = 1;

    std::cout << "a_addr: " << (long long)&a << std::endl;
    std::cout << "b_addr: " << (long long)&b << std::endl;
    std::cout << "g_a_addr: " << (long long)&g_a << std::endl;
    std::cout << "g_b_addr: " << (long long)&g_b << std::endl;
    std::cout << "s_a_addr: " << (long long)&s_a << std::endl;
    std::cout << "s_b_addr: " << (long long)&s_b << std::endl;
    std::cout << "str_addr: " << (long long)&"hello" << std::endl; //字符串常量
    std::cout << "cg_a_addr: " << (long long)&cg_a << std::endl;
    std::cout << "cg_b_addr: " << (long long)&cg_b << std::endl;
    std::cout << "c_a_addr: " << (long long)&c_a << std::endl;
    std::cout << "c_b_addr: " << (long long)&c_b << std::endl;

    return 0;
}

         局部变量和 const 修饰的局部变量(即局部常量)不存放在全局区;

        全局变量静态变量(static 修饰)、字符串常量和 const 修饰的全局变量(全局常量)存放在全局区;

4--栈区

        栈区的数据由编译器自动分配释放,存放函数的参数值、局部变量等;

        注意事项:不要返回局部变量的地址,栈区分配的数据由编译器自动释放;

# include <iostream>

int * func(){
    int a = 10; // 存放在栈区,函数执行完后会被释放
    return &a;
}
int main(){
    int *p = func();
    std::cout << *p << std::endl;
    std::cout << *p << std::endl;
    return 0;
}

        在上面的代码中,函数 func() 的局部变量a存放在栈区中,其地址不能被返回,原因在于函数

 func() 执行完后其数据会被释放;

5--堆区

        堆区由程序员分配释放,若程序员不主动释放,则在程序结束时由操作系统回收;

        在 C++ 中利用 new 关键字来在堆区开辟内存,以存放数据;

# include <iostream>

int * func(){
    // 利用 new 操作符,将数据开辟到堆区
    int* a = new int(10); 
    // 指针 a 本质上也是局部变量,存放在栈中,但指针指向的数据 * a 存放在堆区中
    return a;
}
int main(){
    int *p = func();
    std::cout << *p << std::endl;
    std::cout << *p << std::endl;
    return 0;
}

6--new操作符

        C++利用 new 操作符来在堆区开辟数据;

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

        利用 new 创建的数组,会返回该数据对应类型的指针,需要用指针进行接收;

# include <iostream>

int * func(){
    // 利用 new 操作符,将数据开辟到堆区
    int* a = new int(10); 
    // new 返回是 该数据类型的指针
    return a;
}

// 利用 new 关键字在堆区开辟数组
void test(){
    int * arr = new int[10]; // 数组,10个元素
    for (int i = 0; i < 10; i++){
        arr[i] = i + 100;
    }
    for (int i = 0; i < 10; i++){
        std::cout << arr[i] << std::endl;
    }
    delete[] arr; // 利用delete[]释放数组
}
int main(){
    int *p = func();
    std::cout << *p << std::endl;

    delete p; // 利用操作符delete释放

    test();
    return 0;
}

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

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

相关文章

nvcc 编译并行程序时报错gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录

一、nvcc 编译程序时报错 gcc: error trying to exec cc1plus: execvp: 没有那个文件或目录 cc1plus 是gcc编译工具链中用到的一个程序 报错非常直白&#xff0c;就是说gcc在执行时找不到这个程序 二、问题解决方法 1.确定是否正确安装gcc、g 如果系统中没有正确安装gcc…

elementUI组件下拉框属性的一些配合使用

文章目录1、单选带搜索功能&#xff08;自定义搜索&#xff09;2、下拉多选远程搜索3、下拉多选有默认选项4、下拉多选默认禁用只提供大致思路&#xff0c;大量玩法等你开发【doge】 1、单选带搜索功能&#xff08;自定义搜索&#xff09; 例如&#xff0c;我需要实现一个功能…

关于学习的一些建议

本文的主要讲的内容如图&#x1f447; 文末附有整个Java的学习路线、能力提升和学习建议的思维导图。 快过新年了&#xff01;在过去的一年里&#xff0c;你们收获了什么呢&#xff1f;在未来的一年里&#xff0c;你们有什么新目标吗&#xff1f; 1.定目标 过去的我往往喜欢…

初识 Django

初识 Django参考描述优劣 Django&#xff08;部分&#xff09;优势功能完备&#xff0c;开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版&#xff08;Long Time Support&#xff0c;LTS&#xff09;PIP官网获取检测MVC 与 MVTMVC 架构MTV 架…

力扣sql基础篇(十一)

力扣sql基础篇(十一) 1 每件商品的最新订单 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT p.product_name,o1.product_id,o1.order_id,o1.order_date FROM Orders o1 INNER JOIN ( SELECT pro…

Android自定义绘制1-1 Plus

上一个文章是看着扔物线的视频写的。写玩之后&#xff0c;发现他的文章还有很多内容。尴尬。 接着写呗。 自定义绘制知识的4个级别 1.Canvas的drawXXX()系列方法以及Paint类的一些常见方法。 canvas的drawXXX()是自定义绘制的最基本操作。掌握了这些方法&#xff0c;才知道…

JNPF 3.4.5 java+.Net6 旗舰版企业版 简搭-敏捷业务低代码开发平台

JNPF 低代码通常是指APaaS产品&#xff0c;通过为开发者提供可视化的应用开发环境&#xff0c;降低或去除应用开发对原生代码编写的需求量&#xff0c;进而实现便捷构建应用程序的一种解决方案。广义上低代码概念涵盖所有能够完成代码的集成&#xff0c;减少代码开发的应用过程…

在哔站黑马程序员学习Spring—Spring Framework—(二)spring的注解开发学习笔记

一、注解开发spring的强项—>简化开发spring从2.0开始逐步提供了各种各样的注解&#xff0c;到了2.5注解比较完善&#xff0c;到了3.0推出了纯注解开发,使用java类替代配置文件&#xff0c;开启了spring快速开发通道。二、注解开发定义bean不再需要在spring配置文件中定义be…

拷贝实体的工具类---BeanObjectCopyUtils

目录 前言&#xff1a; 第一步&#xff1a;引用的核心类&#xff1a; 第一种&#xff1a;单个实体的拷贝方法 第二种&#xff1a;列表类的实体拷贝方法 第二步&#xff1a;核心方法的介绍&#xff1a; 核心方法一&#xff0c;介绍了实例化的操作&#xff1a; 核心方法二…

CMMI之项目管理类

项目管理类过程域涵盖了与项目的计划、监督和控制相关的项目管理活动。CMMI-DEV 中的七个项目管理类过程域是&#xff1a;• 集成项目管理&#xff08;Integrated Project Management&#xff0c; IPM&#xff09;• 项目监督与控制&#xff08;Project Monitoring and Control…

蓝桥杯:城邦

题目链接 问题描述 答案提交 本题答案是&#xff1a;4046。 运行限制 思路分析 代码&#xff08;Java&#xff09; 问题描述 小蓝国是一个水上王国, 有 2021 个城邦, 依次编号 1 到 2021。在任意两 个城邦之间, 都有一座桥直接连接。 为了庆祝小蓝国的传统节日, 小蓝国政府…

登录授权方案:JSON Web Tokens (JWT)

登录授权方案&#xff1a;JSON Web Tokens (JWT) JWT官方文档&#xff1a;https://jwt.io/introduction 1.简介&#xff1a; JWT 即 json web tokens&#xff0c;通过JSON形式作为Web应用中的令牌&#xff0c;用于在各方之间安全地将信息作为JSON对象传输&#xff0c;在数据传…

【博客598】从netfilter hook执行原理分析iptables为什么自定义链无法主动调用只能从其它链跳转过来

从netfilter hook执行原理分析iptables为什么自定义链无法主动调用只能从其它链跳转过来 1、netfilter hook执行原理 netfilter 框架是 Linux 网络子系统里的一个核心模块&#xff0c;iptables 就是基于 netfilter 框架实现的一个网络包处理工具。 netfilter hook被调用后执行…

2023年“科学探索奖”申报启动及指南

2023年“科学探索奖”资助不超过50位青年科学家&#xff0c;每位获奖人5年内将获得总计300万元奖金。今年的申报时间为2023年1月1日至3月15日。获奖名单拟定于2023年8月揭晓。本文知识人网小编整理该奖项的概要及申报指南&#xff0c;以飨读者。“科学探索奖”是一项由科学家主…

【高并发内存池】第二弹之threadcache 线程缓存

1.为什么线程向threadcache申请内存不需要加锁&#xff1f; 因为没有把cache设置成全局变量&#xff0c;而是使用了TLS(线程局部存储)&#xff0c;作用是当前内存只可当前线程见到&#xff0c;其他线程没有使用权&#xff0c;避免了加锁的操作&#xff0c;保证了线程数据的独立…

基于paddlex图像分类模型训练(一):图像分类数据集切分:文件夹转化为imagenet训练格式

背景 在使用paddlex GUI训练图像分类时&#xff0c;内部自动对导入的分类文件夹进行细分&#xff0c;本文主要介绍其图像分类数据切分源码&#xff0c;或可作为其他项目储备代码&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/develop/paddlex/tools/dataset_spli…

[Linux]进程概念以及进程状态

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

vs2019 + qt5.12.11 打包

目录 你以为打包方式 实际要添加步骤 你以为打包方式 先吐槽一番&#xff0c;感觉vsqt打包有点巨坑&#xff0c;还是说我第一次打包其实都是这样子的 首先我们将生成的.exe弄到一个打包文件夹里面 然后嘞 我用qt自带的打包工具windeployqt exe &#xff08;因为我的再C盘下…

Mysql基础篇(11)—— MySQL8.0新特性之窗口函数

举例1 假设我现在有这样一个数据表&#xff0c;它显示了某购物网站在每个城市每个区的销售额&#xff1a; CREATE TABLE sales( id INT PRIMARY KEY AUTO_INCREMENT, city VARCHAR(15), county VARCHAR(15), sales_value DECIMAL ); INSERT INTO sales(city,county,sales_val…

【xgboost】XGBoost

XGBoost1. 原理改进及特点1.1 遵循Boosting算法的基本建模流程1.2 平衡精确性与复杂度1.3 降低模型复杂度、提升运行效率1.4 保留部份GBDT属性2. sklearn接口(回归)2.1 导库 & 数据2.2 sklearn api普通训练2.3 sklearn api交叉验证2.4 查看属性接口3. xgboost原生代码(回归…