您现在的位置是:首页 > 技术文章网站首页技术文章
[C++]内存管理机制
1. 在C++中,内存被分成五个区:栈、堆、自由存储区、静态存储区、常量区
2. 栈:存放函数的参数和局部变量,编译器自动分配和释放
3. 堆:new关键字动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收
4. 自由存储区:由malloc分配的内存,和堆十分相似,由对应的free进行释放
5. 全局/静态存储区:存放全局变量和静态变量
6. 常量区:存放常量,不允许被修改
区分栈 与 堆
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new
,我们首先就应该想到,我们分配了一块堆内存,那么指针p
呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p
。在程序会先确定在堆中分配内存的大小,然后调用operator new
分配内存,然后返回这块内存的首地址,放入栈中;
栈 与 堆区别
(1). 管理方式不同:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak;
(2). 空间大小不同:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的;
(3). 能否产生碎片不同:
(3.1)堆:对于堆来讲,频繁的new/delete
势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低;
(3.2)栈:对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列;
(4). 生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长;
(5). 分配方式不同
(5.1)堆:堆都是动态分配的,没有静态分配的堆;
(5.2)栈:
静态分配:静态分配是编译器完成的,比如局部变量的分配;
动态分配:动态分配由alloca
函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现;
(6). 分配效率不同
(6.1)栈:栈是机器系统提供的数据结构,栈的效率比较高;
(6.2)堆:堆则是C/C++函数库提供的,它的机制是很复杂的,堆的效率比栈要低得多;
相关文章
文章评论 (0)