开发者

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

开发者 https://www.devze.com 2024-08-13 15:06 出处:网络 作者: csdn_HZW
目录C++程序代码的五大内存分区预编译编译汇编连接五大内存分区分别是:栈区,堆区,BSS区,数据区,代码区1.栈区2.堆区3.BSS区4.data区5.代码区补充总结C++程序代码的五大内存分区
目录
  • C++程序代码的五大内存分区
    • 预编译
    • 编译
    • 汇编
    • 连接
  • 五大内存分区分别是:栈区,堆区,BSS区,数据区,代码区
    • 1.栈区
    • 2.堆区
    • 3.BSS区
    • 4.data区
    • 5.代码区
    • 补充
  • 总结

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

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

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

    预编译

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

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

    编译

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

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

    汇编

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

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

    连接

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

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

    1.栈区

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

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

    2.堆区

    堆是www.devze.commalloc()函数或者new分配的内存块,使用free或delete来释放内存

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

    3.BSS区

    即block Started by Symbol

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

    4.data区

    即数据区

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

    5.代码区

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

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

    代码如下:

    #include <QCoreApplication>
    #include <IOStream>
    #include<unistd.h>
    using namespace std;
    int a=0;   www.devze.com //在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;    python //栈区,const修饰的变量对存放位置没有影响不要被误导!!!
        static const int e;    //data区
        p1 = (char *)malloc(10);//分配10个字节在堆区
        return a.exec();
    }
    

    补充

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

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

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

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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消