为什么STL内存分配不使用new而使用malloc

为什么STL内存分配不使用new而使用malloc,第1张

函数体内定义的局部变量是auto变量,在函数调用开始时分配空间,这些空间位于栈区,函数调用结束后这些空间自动被释放。使用malloc申请得到的空间是堆区空间,不由函数机制控制,可以由程序的任何部分调用,需要手动使用free释放。之所以需要在堆内存中分配空间,是因为它可以跨函数引用,而且不需要(同样可以跨函数引用的)如全局变量、全局静态变量在进程开始后始终占用静态存储区直至进程退出,可以按需动态地分配和释放。(代价是通过指针等方式引用堆内存比栈内存中需要更多指令周期,效率要低;而且需要手动管理内存分配和回收。) 另外,相比堆内存,栈的内存一般是相当有限的,所以占用空间较大对象的管理一般都直接通过堆内存。 ==== [原创回答团]

实现一个malloc:

在实现malloc之前,先要相对正式地对malloc做一个定义。

根据标准C库函数的定义,malloc具有如下原型:

void malloc(size_t size);

这个函数要实现的功能是在系统中分配一段连续的可用的内存,具体有如下要求:

malloc分配的内存大小至少为size参数所指定的字节数

malloc的返回值是一个指针,指向一段可用内存的起始地址

多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉

malloc应该尽快完成内存分配并返回(不能使用NP-hard的内存分配算法)

实现malloc时应同时实现内存大小调整和内存释放函数(即realloc和free)

对于malloc更多的说明可以在命令行中键入以下命令查看:

1man malloc

2 预备知识

在实现malloc之前,需要先解释一些Linux系统内存相关的知识。

21 Linux内存管理

211 虚拟内存地址与物理内存地址

为了简单,现代 *** 作系统在处理内存地址时,普遍采用虚拟内存地址技术。即在汇编程序(或机器语言)层面,当涉及内存地址时,都是使用虚拟内存地址。采用这种技术时,每个进程仿佛自己独享一片2N字节的内存,其中N是机器位数。例如在64位CPU和64位 *** 作系统下,每个进程的虚拟地址空间为264Byte。

这种虚拟地址空间的作用主要是简化程序的编写及方便 *** 作系统对进程间内存的隔离管理,真实中的进程不太可能(也用不到)如此大的内存空间,实际能用到的内存取决于物理内存大小。

由于在机器语言层面都是采用虚拟地址,当实际的机器码程序涉及到内存 *** 作时,需要根据当前进程运行的实际上下文将虚拟地址转换为物理内存地址,才能实现对真实内存数据的 *** 作。这个转换一般由一个叫MMU(Memory Management Unit)的硬件完成。

1、C语言中不支持。

C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用。做为解决方案,你可以使用C式的malloc函数或者C++式的new函数来在堆上动态分配内存,这样长度是完全可以自定的。

2、C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

3、、在数组一章中,曾介绍过数组的长度是预先定义好的, 在整个程序中固定不变。C语言中不允许动态数组类型。例如: int n;scanf("%d",&n);int a[n]; 用变量表示长度,想对数组的大小作动态说明, 这是错误的。但是在实际的编程中,往往会发生这种情况, 即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题, 用数组的办法很难解决。

4、为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间, 也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。 其它文献中所提到的"动态数组",指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小其本质是一个指向数组的指针变量常用的内存管理函数有以下三个:分配内存空间函数malloc;分配内存空间函数 calloc;释放内存空间函数free。

必须使用指针来接收改函数的返回值,可以通过该指针来释放内存

void GetMemory(int size)

{

return malloc(size);

}

void main()

{

void p = GetMemory(100);

free(p);

p = NULL;

}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12186744.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存