日期:2014-05-18  浏览次数:20774 次

我郁郁了!!!!!编程中堆栈,内存等问题仍是不解...跪求!!!不断加分中...
[color=#0000FF][/color]堆栈是一种数据结构怎么说???

编程中如C#又有“内存堆”,“内存栈”怎么说??

内存条(物理内存)本身不分堆栈,是由进程分配的吗?



内存堆,内存栈也只是两种数据结构存储的数据吗??,打个比方:int a=1;软件运行的时候,a这个值类型存在“内存栈”中,这个“内存栈”是怎么来的??
是软件进程在运行的时候,开始加载相关的DLL,根据DLL中的元数据(是值类型,还是引用类型等),来动态分配出来的吗...



是不是,值类型按“内存栈”的数据结构存(后进先出),引用类型按“内存堆”数据结构存(随意进出),内存本身是不是在任何时候都“不分堆栈物理区”,只是一种数据结构,是这样的吗??


还有为什么要用这两种数据结构,为什么不是只有堆或只有栈,谁来控制所谓的“进出顺序”??



跪求一解!!!!!

------解决方案--------------------
不太理解,但是我知道好像c#中引用类型是存在堆中的,而值类型是在stack中,堆栈先进后出,进出效率高一点,而堆在对象(class)实例有优势。
------解决方案--------------------
你只有郁闷了,你请C++里去问,这里用C#并不能回答你的问题
------解决方案--------------------
多看看数据结构就清楚了
http://topic.csdn.net/t/20060526/17/4781591.html

------解决方案--------------------
其实我也搞不懂
------解决方案--------------------
引用楼主 aspnet30 的帖子:
堆栈是一种数据结构怎么说???

编程中如C#又有“内存堆”,“内存栈”怎么说??

内存条(物理内存)本身不分堆栈,是由进程分配的吗?


内存堆,内存栈也只是两种数据结构存储的数据吗??,打个比方:int a=1;软件运行的时候,a这个值类型存在“内存栈”中,这个“内存栈”是怎么来的??
是软件进程在运行的时候,开始加载相关的DLL,根据DLL中的元数据(是值类型,还是引用类型等),来动态分配出来的吗...


------解决方案--------------------
“内存条(物理内存)本身不分堆栈”-〉这里的堆栈只是一个逻辑上的概念;
比如“书架”—〉“内存条(物理内存)”,但是书架上怎么分类放东西是你->“操作系统”来决定的。
你可能把第一排叫“古典文学”-〉“堆”,第二排叫“现代文学”-〉“栈”;
还有关于“现代文学”-〉“栈”具体怎么摆放也是由你->“操作系统”来决定的;

现代的操作系统在实现“栈”这个逻辑对象的时候规定了它只能“后进先出”;
更加具体的细节请lz找一本操作系统的书看看。


------解决方案--------------------
探讨
引用楼主 aspnet30 的帖子:
堆栈是一种数据结构怎么说???

编程中如C#又有“内存堆”,“内存栈”怎么说??

内存条(物理内存)本身不分堆栈,是由进程分配的吗?


内存堆,内存栈也只是两种数据结构存储的数据吗??,打个比方:int a=1;软件运行的时候,a这个值类型存在“内存栈”中,这个“内存栈”是怎么来的??
是软件进程在运行的时候,开始加载相关的DLL,根据DLL中的元数据(是值类型,还是引用类型等…

------解决方案--------------------
每个进程初始化都会由操作系统非配一个空间,具体可以看windows高级编程,有章将进程的有专门介绍

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

.NET中内存结构又有所不同
------解决方案--------------------
mark
------解决方案--------------------
堆区 栈区的字面可以这么解释:这一块内存区域以"栈"的方式使用,那一块内存在"堆"的方式使用.
至于这两种"方式"都是什么原理,参考数据结构.
这么说可以吗?
------解决方案--------------------
堆 顾名思义:只管往里面扔东西就OK 它的存储和消亡一般没有什么规律 
栈 必须按照先进后出的原则进行存储和弹出
对于C#
栈上存储的一般是 存储 值类型 和托管(引用)类型的指针(它是一个int型的)指向托管堆中的一块内存 string a;就是在栈上申请一个指针(它只占一个int)
托管堆 中用于分配托管(应用)类型的真实内存 a ="abdser"; 就是在对上分配一个string类的一块内存
------解决方案--------------------
帮顶一下
------解决方案--------------------
探讨
但这也不对啊,一个进程应该只有一个堆,栈,全局等区吧

他到底是什么时候被划分出来的,

是操作系统一运行的时候,就分好了堆栈,还是某个软件运行的时候,开始分为堆栈

如果是软件运行的时候,进程去分配堆栈,我就不理解了,他要拿出多少内存来分为堆栈区呢,他也不知道程序会运行到哪一步,哪一步需要多少内存;