Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为什么我们只有两种数据结构“堆栈”和“堆”?_C# 4.0_Memory Management_Heap Memory_Stack Memory - Fatal编程技术网

C# 4.0 为什么我们只有两种数据结构“堆栈”和“堆”?

C# 4.0 为什么我们只有两种数据结构“堆栈”和“堆”?,c#-4.0,memory-management,heap-memory,stack-memory,C# 4.0,Memory Management,Heap Memory,Stack Memory,为什么我们只有两个数据结构堆栈和堆?类似的int值将存储在堆栈中,类似的引用类型值将存储在heap中 为什么我们不能使用其他数据结构?是否有任何特定的理由只使用这两个堆栈和堆 非常感谢。堆栈是一种数据结构。堆不是数据结构。可以在堆中创建堆栈 事实上,按照您描述它们的方式,它们是内存分配方案。编程语言用户有第三种机制:静态分配 如果你落后于编程语言,堆就是内存。堆栈就是内存。使堆栈成为堆栈的唯一原因是内存分配为后进后出。任何内存都可以是堆栈 这听起来像是在进行详细的阐述 可执行文件和共享库文件实际

为什么我们只有两个数据结构堆栈和堆?类似的int值将存储在堆栈中,类似的引用类型值将存储在heap中

为什么我们不能使用其他数据结构?是否有任何特定的理由只使用这两个堆栈和堆


非常感谢。

堆栈是一种数据结构。堆不是数据结构。可以在堆中创建堆栈

事实上,按照您描述它们的方式,它们是内存分配方案。编程语言用户有第三种机制:静态分配

如果你落后于编程语言,堆就是内存。堆栈就是内存。使堆栈成为堆栈的唯一原因是内存分配为后进后出。任何内存都可以是堆栈

这听起来像是在进行详细的阐述

可执行文件和共享库文件实际上是指示加载程序执行操作的程序。运行程序时,可执行文件会指示加载程序分配内存页。该内存通常是只读静态数据、读/写初始化程序数据、读/写需求零静态数据初始化为零以及读/执行页面。可执行文件指向要创建的块之一被指定为堆栈。EXE指令加载程序将堆栈指针寄存器放置在该块顶部附近

请注意,程序启动时没有堆

一旦程序启动,内存管理器就可能执行。通常一个程序中只有一个内存管理器,但也可以有多个内存管理器。这些内存管理器分配成为堆的读/写内存页

应用程序完全可以使用内存管理器分配一块内存,然后使程序堆栈变得罕见,但通常为各种算法分配应用程序堆栈

堆栈是一种通用的数据结构。 程序堆栈是由堆栈指针寄存器管理的堆栈。 堆栈本身只是一块读/写内存

堆只是由内存管理器控制的块或读/写内存。内存管理器肯定会在堆上强加一个数据结构,但该结构对应用程序不可见。应用程序只看到页面已添加到其地址空间

然后有两个级别的动态内存分配

从操作系统分配页面 内存管理器的块分配。 内存管理器必须调用1为2服务调用。一般来说,从内存管理器分配的内存是动态的

但是,应用程序中加载的页面也可以是动态的。当程序加载器设置应用程序的初始状态时,应用程序可以通过分配和释放页面来修改其页面布局。在大多数系统中,应用程序甚至可以释放应用程序加载程序创建的页面,但这很可能会导致崩溃

总结: 1.应用程序可以具有只读、读/写初始化或要求零以及读/执行内存页。 2.任何页面都可以成为程序堆栈,但最好是读/写。
3.一个或多个内存管理器可以分配读/写页面并将其用于堆。

堆栈和内存分配上下文中的堆不是数据结构。它们是内存布局方案,可以或不能分别用堆栈/堆实现

这两种内存布局方案的存在源于对两种不同类型内存的需求:

仅在函数生命周期内存在的内存,如函数参数、局部变量和返回值。 无限期存在的内存,即使函数退出也会持续存在。 我们考虑2种情况:

静态内存分配 首先,想象一下,如果我们处理的函数只接受参数和输入,并返回一些值作为输出,而不使用局部变量。需要分配内存,以便在函数启动前以某种方式存储参数,并在函数存在后存储返回值。数据结构的自然选择是堆栈。每次调用新函数时,都会在名为运行时堆栈的堆栈上分配一个新的堆栈帧,并将参数推送到该堆栈。只要函数存在,它的堆栈帧就会从堆栈中弹出,并推送它的返回,以便调用方可以读取它

该方案可以扩展到支持局部变量。根据定义,任何局部变量只在函数的生存期内存在。因此,它们非常适合,我们可以在函数的堆栈框架中为它们分配空间

该堆栈可以以任意多种方式实现,如连续数组或链表,但最终它仍然充当堆栈,只能在顶部进行push/pop操作。T hat约束是可以接受的,因为函数和函数调用的工作方式具有以下特点: -函数在其调用的所有函数完成之前不能退出。因此,不需要在堆栈不在顶部的位置删除堆栈帧。 -只有当前运行的函数才能进行新的函数调用。因此,不需要在堆栈顶部以外的位置添加堆栈帧

动态内存分配 其次,我们有内存,它需要能够无限期地存在,而不受定义它的函数生命周期的限制。这可以通过多种方式实现。可能有一个连续的数组被拆分并以某种方式分配,这最终就是RAM的工作方式。它可以是链表,也可以是树结构。A恰好是一种树,但这是巧合。术语堆(heap)与动态内存分配有关,它的意思是一堆或一堆东西,一个无组织的集合

第三种情况
不存在,因为内存生存期没有第三个选项。它们要么绑定到函数的生存期,要么不绑定到函数的生存期。第三个内存分配方案只有在我们有前两种情况未涉及的第三个需求时才会存在。

int值将存储在堆栈中是一个实现细节,对堆上的ref类型也是如此。不要调用这些数据结构。它们是内存区域。尤其令人困惑的是,还有称为堆栈和堆的数据结构。背景阅读:向上投票,因为我没有一个好的答案,除了你还需要什么?这实际上可能是答案,但也许有人可以插话。这是相当荒谬的,C语言中有很多奇妙的数据结构。如果你在程序中不使用列表、字典或数组,那么你就是做错了。术语heap和stack只是深度简化的抽象,与执行C代码时发生的事情没有太大关系。stack是一种数据结构。true,`堆不是数据结构。`,编程语言用户有第三种机制:false。静态分配。是堆栈上的分配。静态分配不是堆栈上的分配,而是程序启动时加载的内存页上的分配。与堆不同,静态分配可能是读/写或只读的。在编辑我的答案之前,让我先研究一下为什么所有答案都有意义?AdityaKumar我回答了你的问题吗?是的,但我不能为你投票,因为声望很低。为什么会有-1次投票?答案不对吗?