C++程序代码的五大内存分区方式

 更新时间:2024年04月23日 10:23:52   作者:csdn_HZW  
这篇文章主要介绍了C++程序代码的五大内存分区方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++程序代码的五大内存分区

在讲分区前,我们首先要了解程序运行的四个过程:

预编译

预编译主要完成以下三个具体任务:

  • (1)把include中的头文件复制到要编译的源文件中
  • (2)用实际值代替define文本
  • (3)在调用宏的地方进行宏替换

编译

编译的主要功能包括两个部分,第一部分是检查代码的语法,如果语法错误则给出错误提示并结束编译,只有在代码无语法错误的情况下才能进入大二部分。

第二部分是将预编译后的文件转换为汇编语言。

汇编

汇编的主要功能是将汇编语言代码变成目标代码(机器代码)

但不进行连接,并生成目标文件,即二进制文件

连接

连接的主要功能是连接目标代码,并生成可执行文件。

五大内存分区分别是:栈区,堆区,BSS区,数据区,代码区

1.栈区

由编译器自动分配释放,存放函数的参数值、返回值和局部变量

在程序运行过程中实施分配和释放,栈区由操作系统自动管理,无需程序员手动管理。

2.堆区

堆是由malloc()函数或者new分配的内存块,使用free或delete来释放内存

堆的申请和释放由程序员控制,容易导致内存泄漏,导致后面代码无法访问这片内存区域,程序退出后系统自动回收。

3.BSS区

即Block Started by Symbol

存放的是未初始化的全局变量和未初始化的静态变量。

4.data区

即数据区

存放已初始化的全局变量、静态变量和常量数据。

5.代码区

存放cpu执行的机器指令,代码区是可共享,并且是只读的。

以下是从网上找的一个例子,看例子能够更直观的了解各行代码在内存中的处在哪个区

代码如下:

#include <QCoreApplication>
#include <iostream>
#include<unistd.h>
using namespace std;
int a=0;    //在data区,已初始化的全局变量 
char *p1;   //在BSS区,未初始化的全局变量
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int b;      //栈区,临时变量
    char s[] = "asd";     //栈区,临时变量
    char *p2 = "123";     //123是字符串常量,在data区,p2在栈区
    static int c = 0;    //c是已初始化静态变量,在data区
    const int d = 0;     //栈区,const修饰的变量对存放位置没有影响不要被误导!!!
    static const int e;    //data区
    p1 = (char *)malloc(10);//分配10个字节在堆区
    return a.exec();
}

补充

static全局变量和普通全局变量的区别:

  • static全局变量只初始化一次,只能在当前文件下使用
  • 普通全局变量可以在别的文件中加extern使用

static局部变量和普通局部变量的区别:

  • static局部变量只被初始化一次,下一次使用的初始值为上一次的结果值
  • 普通局部变量如果在函数中或者在循环中,当函数或者循环结束后也就被回收

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++ 虚函数实战示例详解

    C++ 虚函数实战示例详解

    C++抽象基类cap_ops定义设备操作接口,支持多态,统一管理摄像头、传感器等设备,包含线程控制与资源管理方法,建议使用智能指针和日志,便于扩展和维护,本文给大家介绍C++ 虚函数实战,感兴趣的朋友一起看看吧
    2025-07-07
  • C++ 随机数字以及随机数字加字母生成的案例

    C++ 随机数字以及随机数字加字母生成的案例

    这篇文章主要介绍了C++ 随机数字以及随机数字加字母生成的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C语言实现文件内容按行随机排列的算法示例

    C语言实现文件内容按行随机排列的算法示例

    这篇文章主要介绍了C语言实现文件内容按行随机排列的算法,涉及C语言字符串、数组遍历与随机数相关算法实现技巧,需要的朋友可以参考下
    2017-09-09
  • C++ 单例模式的几种实现方式研究

    C++ 单例模式的几种实现方式研究

    单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目。但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况
    2019-01-01
  • MFC实现漂亮界面之美化按钮

    MFC实现漂亮界面之美化按钮

    这篇文章主要为大家详细介绍了MFC实现漂亮界面之美化按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C语言实现高精度加法的示例代码

    C语言实现高精度加法的示例代码

    高精度的本质是将数字以字符串的形式读入,然后将每一位分别存放入int数组中,通过模拟每一位的运算过程,来实现最终的运算效果,下面我们就来看看如何通过C语言实现高精度加法吧
    2023-11-11
  • Qt基于QScrollArea实现界面嵌套移动

    Qt基于QScrollArea实现界面嵌套移动

    在实际的应用场景中,经常会出现软件界面战场图大于实际窗体大小。本文将利用QScrollArea可以为widget窗体添加滚动条,实现界面嵌套移动,感兴趣的可以了解一下
    2022-06-06
  • 详解C++函数模板与分离编译模式

    详解C++函数模板与分离编译模式

    这篇文章主要介绍了详解C++函数模板与分离编译模式的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C语言中数组排序浅析

    C语言中数组排序浅析

    这篇文章主要为大家介绍了C语言算法练习中数组元素排序的四种类型,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-12-12
  • C语言修炼之路灵根孕育源流出 初识C言大道生上篇

    C语言修炼之路灵根孕育源流出 初识C言大道生上篇

    C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言
    2022-03-03

最新评论