您现在的位置是:首页 > 技术文章网站首页技术文章

[C++]内存管理机制

  • WangYe
  • 2020-09-05 11:00:21
  • 264 次阅读
了解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)



Top