C++运行时内存分为几个区啊?
C++运行时内存分为几个区啊?怎么有些人说是分为:堆、栈、自由存储区、全局区、常量区,有些人说是分为:堆、栈、全局区、常量区、代码区呢。为什么要这样分啊?是因为程序运行方...
C++运行时内存分为几个区啊?怎么有些人说是分为:堆、栈、自由存储区、全局区、常量区,有些人说是分为:堆、栈、全局区、常量区、代码区呢。
为什么要这样分啊?是因为程序运行方式的需要呢还是从程序数据安全性和时间效率上分的啊? 展开
为什么要这样分啊?是因为程序运行方式的需要呢还是从程序数据安全性和时间效率上分的啊? 展开
4个回答
推荐于2017-09-20 · 知道合伙人数码行家
关注
展开全部
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由用户的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由用户的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
展开全部
其实吧,说的简单点是,怎么分,并不重要。
说的复杂点是,其实不分的,例如说,你随便去书店也好,去网上也好,哪怕是看c++之父写的c++ programming language,还是看经典的c++ primer,或者是think in c++这些畅销书,里面有一丁点一丝毫讲你所谓的分区了吗?没有,一点点都没有,为什么不讲?因为我们站在高级语言的角度来看,没必要想这些。
你或者去看80X86的汇编,发现是分段的,或者说分区吧,不过这个只是8086汇编而已,就算是指令集常见的也很多种的,并不是都那么分段、分区的。
再说操作系统,现在一般都是页式内存管理,程序空间都是逻辑空间,物理空间也没什么严格的分区,更何况还这么多。
所以说一个程序如果真的分区,顶多也是从操作系统的角度去看待的。就算是拿单一的操作系统来看,比如说windows吧。简单一些会说,常量在常量区,一定吗?不是吧,比如说局部的常量就在程序栈里面,要说一定会在那吗?其实也不一定,编译器完全可以根据需要把它安排在其他地方,用空间换时间。
我想说的是阿,你没必要思考这些,你要是学过操作系统,学过计算机系统结构,学过汇编(我说的是一般大学的基本专业课),增加点阅历,这些自然就能理解了,现在要全套跟你说这个思路,你也不好理解。
其实最简单的说就是,c++只管自己的东西就行,不用去关心编译器怎么做,不用去关心操作系统怎么分配内存,这也是系统的事,c++只要保证自己正确就好了
说的复杂点是,其实不分的,例如说,你随便去书店也好,去网上也好,哪怕是看c++之父写的c++ programming language,还是看经典的c++ primer,或者是think in c++这些畅销书,里面有一丁点一丝毫讲你所谓的分区了吗?没有,一点点都没有,为什么不讲?因为我们站在高级语言的角度来看,没必要想这些。
你或者去看80X86的汇编,发现是分段的,或者说分区吧,不过这个只是8086汇编而已,就算是指令集常见的也很多种的,并不是都那么分段、分区的。
再说操作系统,现在一般都是页式内存管理,程序空间都是逻辑空间,物理空间也没什么严格的分区,更何况还这么多。
所以说一个程序如果真的分区,顶多也是从操作系统的角度去看待的。就算是拿单一的操作系统来看,比如说windows吧。简单一些会说,常量在常量区,一定吗?不是吧,比如说局部的常量就在程序栈里面,要说一定会在那吗?其实也不一定,编译器完全可以根据需要把它安排在其他地方,用空间换时间。
我想说的是阿,你没必要思考这些,你要是学过操作系统,学过计算机系统结构,学过汇编(我说的是一般大学的基本专业课),增加点阅历,这些自然就能理解了,现在要全套跟你说这个思路,你也不好理解。
其实最简单的说就是,c++只管自己的东西就行,不用去关心编译器怎么做,不用去关心操作系统怎么分配内存,这也是系统的事,c++只要保证自己正确就好了
追问
可是在设计程序,尤其是设计到效率的时候好像要考虑这些吧,而且听说面试的时候也经常会被问到这些操作系统级别的东西,能不能大致的指点下我啊,很想知道。
追答
不是阿,你从高级语言肯定是没有方法控制编译器和系统的问题,你可以了解一个平台然后尽量去优化,或者干脆去用低级语言。
细化到系统的时候,就算有面试题也是系统的,和高级语言就无关了,例如Unix从系统全局角度就分为程序区,系统区,控制区,这只能说是从系统角度去说。高级语言本身并不控制那么多,这就是分工,各自做好各自的事情,要高级语言能控制那么多,那C语言怎么分区?Objective-C语言怎么分区?Pascal语言怎么分区?Basic语言怎么分区?都是高级语言阿。
我认为,至少能理解高级语言这个层,和其他层是分开的,也是进步。
不要什么都听说啦,网上就能找到很多面试题,你可以找来看看不就更放心吗?百度一下啦~~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为cpu寄存器处理的需要
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我们学的好像是有栈区,堆区,全局数据区,代码区
具体都是什么情况也没有好好了解
具体都是什么情况也没有好好了解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |