除了记住对象指针的地址外,我认为操作系统还需要记录内存的大小。这样,当我们使用delete
时,操作系统将知道要释放多少内存。
谁能告诉我更多关于这方面的细节?还记录了哪些其他信息?这些信息存储在哪里?删除内存后,操作系统会做什么?
发布于 2011-04-22 12:40:18
如前所述,new
是一个库函数,而不是操作系统特性。
一般情况大致如下:
equivalent)
new
的函数调用(或者equivalent)
new
关键字转换为对malloc()
的函数调用(或者your保留一个空闲内存块的列表,它会在那里搜索最佳匹配)。发布于 2011-04-22 12:55:16
谁能告诉我更多关于这方面的细节?
这些都是高度依赖于操作系统和编译器的细节,我只能提供相当广泛的答案(但您真的不必担心这一点,当然,除非您正在考虑从事这项工作)。
还记录了哪些其他信息?
通常,freestore内存通常被称为“堆”。这基本上是因为它是作为堆实现的,这是一种构建节点树(空闲内存块)的优先级队列实现。实际的实现和使用的算法非常复杂,因为它们需要执行得非常好(例如,当请求新内存时,需要非常快地找到空闲块,并且必须非常快地将新释放的内存合并到堆中),然后,还有所有的碎片问题等等。请查看Buddy memory allocation上的维基,以获得一个非常简化的版本。
因此,不仅仅是分配的指针列表和它们对应的内存块大小。事实上,可用内存块的列表要重要得多。
和这些信息存储在哪里?
堆是正在运行的程序的一部分(实际上,每个进程,甚至每个加载的模块,都将具有一个或多个这样的结构)。堆没有驻留在操作系统中(我甚至不确定它是否需要由操作系统提供,至少不是所有OSes都需要)。但是,每当程序的内存请求耗尽容量时,堆显然会要求操作系统为其提供大量内存块,以便合并到其空闲内存块树中。
删除内存后,操作系统会做什么?
通常,当您删除内存时,它只是被添加到空闲(或可用)内存块列表中,并可能与相邻的空闲内存块合并。不存在“用零填充内存”或对内存进行的任何其他实际操作,这是不必要的,也是对处理时间的浪费。
https://stackoverflow.com/questions/5752239
复制相似问题