求详细解释内存到底是如何在被操作?堆和栈是哪来的?哪位高手在管理
求详细解释内存到底是怎么在被操作?堆和栈是哪来的?谁在管理?
http://tieba.baidu.com/p/4129805566
在贴吧上看到这么一个帖子,其实我的理解也很浅显而已,只知道堆是new和delete或者malloc和free搞出来的,但是这一块是谁分配的?怎么在管理?还有栈等等等等内存区都是什么情况?
我还想知道这个贴吧的那些个大神是什么心态?
------解决思路----------------------
这个看操作系统原理.
------解决思路----------------------
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
------解决思路----------------------
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533
------解决思路----------------------
栈上分配的内存不用自己释放,函数运行完后会自动移动栈指针,相当于释放了变量的内存
动态分配的则需要自己释放
------解决思路----------------------
说说我的看法:堆和栈均是由系统管理的(数据结构中的堆和栈除外),栈主要是用于保存函数调用相关的信息(如:临时变量、返回地址等),堆主要是用动态申请内存,如:new\malloc;
堆并不是由new/malloc等搞出来的,new/malloc只是从堆上申请动态的内存而已,堆存在于内存,由操作系统划了分区;
一个程序加载成功(由加载器完成)后,语言运行时库会根据需要向操作系统申请一大块内存,然后当你的程序调用new/malloc时,实际上是从语言运行时库申请内存(而非操作系统),delete/free反之,也不是把内存归还给操作系统而是归还给语言运行时库;
栈上的内存,在编译时确定了大小,在程序加载时向系统申请的,这块内存不需要程序员显示释放
可能会存在偏差,如果你想学习这块的知识建议好好学习操作系统的理论,然后再找本和编译器相关的书看看,对你会有帮助
http://tieba.baidu.com/p/4129805566
在贴吧上看到这么一个帖子,其实我的理解也很浅显而已,只知道堆是new和delete或者malloc和free搞出来的,但是这一块是谁分配的?怎么在管理?还有栈等等等等内存区都是什么情况?
我还想知道这个贴吧的那些个大神是什么心态?
------解决思路----------------------
这个看操作系统原理.
------解决思路----------------------
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
------解决思路----------------------
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533
------解决思路----------------------
栈上分配的内存不用自己释放,函数运行完后会自动移动栈指针,相当于释放了变量的内存
动态分配的则需要自己释放
------解决思路----------------------
说说我的看法:堆和栈均是由系统管理的(数据结构中的堆和栈除外),栈主要是用于保存函数调用相关的信息(如:临时变量、返回地址等),堆主要是用动态申请内存,如:new\malloc;
堆并不是由new/malloc等搞出来的,new/malloc只是从堆上申请动态的内存而已,堆存在于内存,由操作系统划了分区;
一个程序加载成功(由加载器完成)后,语言运行时库会根据需要向操作系统申请一大块内存,然后当你的程序调用new/malloc时,实际上是从语言运行时库申请内存(而非操作系统),delete/free反之,也不是把内存归还给操作系统而是归还给语言运行时库;
栈上的内存,在编译时确定了大小,在程序加载时向系统申请的,这块内存不需要程序员显示释放
可能会存在偏差,如果你想学习这块的知识建议好好学习操作系统的理论,然后再找本和编译器相关的书看看,对你会有帮助