问题 :
C++运行时内存分为几个区啊?怎么有些人说是分为:堆、栈、自由存储区、全局区、常量区,有些人说是分为:堆、栈、全局区、常量区、代码区呢。
为什么要这样分啊?是因为程序运行方式的需要呢还是从程序数据安全性和时间效率上分的啊?
回答 :
其实吧,说的简单点是,怎么分,并不重要。
说的复杂点是,其实不分的,例如说,你随便去书店也好,去网上也好,哪怕是看c++之父写的c++ programming language,还是看经典的c++ primer,或者是think in c++这些畅销书,里面有一丁点一丝毫讲你所谓的分区了吗?没有,一点点都没有,为什么不讲?因为我们站在高级语言的角度来看,没必要想这些。
你或者去看80X86的汇编,发现是分段的,或者说分区吧,不过这个只是8086汇编而已,就算是指令集常见的也很多种的,并不是都那么分段、分区的。
再说操作系统,现在一般都是页式内存管理,程序空间都是逻辑空间,物理空间也没什么严格的分区,更何况还这么多。
所以说一个程序如果真的分区,顶多也是从操作系统的角度去看待的。就算是拿单一的操作系统来看,比如说windows吧。简单一些会说,常量在常量区,一定吗?不是吧,比如说局部的常量就在程序栈里面,要说一定会在那吗?其实也不一定,编译器完全可以根据需要把它安排在其他地方,用空间换时间。
我想说的是阿,你没必要思考这些,你要是学过操作系统,学过计算机系统结构,学过汇编(我说的是一般大学的基本专业课),增加点阅历,这些自然就能理解了,现在要全套跟你说这个思路,你也不好理解。
其实最简单的说就是,c++只管自己的东西就行,不用去关心编译器怎么做,不用去关心操作系统怎么分配内存,这也是系统的事,c++只要保证自己正确就好了
追问
可是在设计程序,尤其是设计到效率的时候好像要考虑这些吧,而且听说面试的时候也经常会被问到这些操作系统级别的东西,能不能大致的指点下我啊,很想知道。
回答
不是阿,你从高级语言肯定是没有方法控制编译器和系统的问题,你可以了解一个平台然后尽量去优化,或者干脆去用低级语言。
细化到系统的时候,就算有面试题也是系统的,和高级语言就无关了,例如Unix从系统全局角度就分为程序区,系统区,控制区,这只能说是从系统角度去说。高级语言本身并不控制那么多,这就是分工,各自做好各自的事情,要高级语言能控制那么多,那C语言怎么分区?Objective-C语言怎么分区?Pascal语言怎么分区?Basic语言怎么分区?都是高级语言阿。
我认为,至少能理解高级语言这个层,和其他层是分开的,也是进步。
不要什么都听说啦,网上就能找到很多面试题,你可以找来看看不就更放心吗?百度一下啦~~