C++内存分区

本文根据10W+字C语言硬核总结(一),值得阅读收藏!_C语言与CPP编程的博客-CSDN博客整理,帮助我了解了内存方面相关的知识。

在介绍内存空间之前,我想先总结一下编译的过程,本人是自学C/C++语言,所以一些基础理解的不是太好,刚开始的时候一直记不住编译的过程,记住了编译的过程后,又被语法分析等一系列的东西弄懵了,查阅了大量资料后,了它们之间的关系

编译过程:预处理——>编译——>汇编——>连接,其中,第二部分编译过程可以再进行划分,分为:词法分析——>语法分析——>语义分析(类型检查)——>优化——>生成代码(转换为低级语言,为后面的汇编做准备),这几个阶段分别做了哪些事可以参考这篇文章编译过程的五个阶段 - 小布谷 - 博客园 (cnblogs.com)

根据大神总结的文章可以看出,内存分区模型分为程序运行之前和程序运行之后两部分

1、程序运行之前,总的来说,分为代码区和数据区(data段和bss段),之所以把这两部分分开,也是考虑到了执行效率方面的问题,我的理解中,代码区可以看作是Linux中的shell脚本,将所有需要加载的指令写出来,为共享的,使用时直接用即可,不涉及到其它的操作,但是是不是这样还有待考证,而数据区又可以分为data段和bss区,至于这两部分中有什么,大神的文章中描述的很详细了,这里不再赘述

2、程序运行之后的分区除了上述所描述的三个区,根据可执行程序的信息又增加了栈区和堆区,注意,程序运行期间代码区和全局区(data区和bss区)的大小不可改变,而不同类型的变量会被存储在哪个分区,下面的这副图描绘的已经十分详细,这里不再赘述

(这副图也是大神的博文里的)

在程序运行后的分区为代码区 ,全局/静态区、堆区、栈区,只不过于运行前不一样的是,运行后的全局区/静态区不再区分初始化和未初始化的部分,总的来说,在C++中的内存分区只有两个,代码区和数据区,而数据区又可以进行细分,分为以下的情况:

数据区包括:堆,栈,全局/静态存储区。

  • 全局/静态存储区包括:常量区,全局区、静态区。

  • 常量区包括:字符串常量区、常变量区。

堆和栈的区别:静态存储区、栈区、堆区的区别_Captain--Jack-CSDN博客_堆栈静态区的区别

而代码区则是存放程序编译后的二进制代码,不可寻址区。包括字符常量区。

当然,这篇文章只是简单的总结了一下内存的分区问题,内存分区这里还有很多需要了解的地方,这里推荐将上述问题弄明白的读者阅读堆、栈、程序区、静态数据区、字符常量区的介绍与区别_RazilFelix的博客-CSDN博客_字符常量区这篇文章,将分区问题讲的更加详细,根据这篇文章里所描述的,全局变量和静态变量是存储在一块空间里的,它们的空间是连续的,而字符串是存储在代码区中的字符常量区,所以它的值不可改变其实它们具体的区别我还是没有太弄懂,后面如果弄懂了的话会补充进来的ԾㅂԾ

在内存分区这里还会经常遇到的一个问题就是new和malloc的区别,其实刚开始我想整理内存分区的东西就是因为我在整理new和malloc的区别时对new产生的变量在自由存储区有疑,这里也是将我阅读的文章附上经典面试题之new和malloc的区别_nie19940803的博客-CSDN博客_new和malloc的区别,这里也附上另外一个经典面试问题nullptr和NULL的区别的解答C++中NULL和nullptr的区别_天涯明月刀的博客-CSDN博客_nullptr和null区别

(其实简单来说NULL作为函数参数被调用时会被当作int类型,而nullptr会被当作空指针,在函数重载时它们的区别较大)

笔者为在校学生,希望这篇文章会对你有帮助,如果有不对的地方欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值