C/C++内存区域划分详解
C语言在内存中一共分为如下几个区域,分别是:
1. 内存栈区: 存放局部变量名;
2. 内存堆区: 存放new或者malloc出来的对象;
3. 常数区: 存放局部变量或者全局变量的值;
4. 静态区: 用于存放全局变量或者静态变量;
5. 代码区:二进制代码。
知道如上一些内存分配机制,有助于我们理解指针的概念。
C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。
C/C++内存区域划分详解
C/C++内存分布
C/C++中,内存主要分为、堆、栈、全局/静态存储区和常量存储区。
栈:栈又叫堆栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等,是向下增长的。所谓向下生长的就是,先调用的栈帧的地址比后调用的地址大,栈一般大小有几个M左右。
#include<iostream> using namespace std; void f2() { int b = 0; cout << "b:" << &b << endl; } void f1() { int a = 0; cout <<"a:" <<&a << endl; f2(); } int main() { f1(); return 0; }
堆:就是那些由new/malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new/malloc就要对应一个delete/free,由程序员主动释放。堆是可以上增长的.意思是先建立的堆的地址小于后建立的堆的地址。
#include<iostream> using namespace std; int main() { void* p1 = malloc(10); void* p2 = malloc(10); cout << p1 << endl; cout << p2 << endl; return 0; }
数据段:存储全局数据和静态数据。
代码段:可执行的代码/只读常量
知道了内存分布,下面就来做题吧,考验知识的时候到了,看看会做几题吧
是不是前几题还得心应手,后面就有点懵了
栈和堆的区别:
栈:由编译器自动分配并且释放,一般存储函数的参数局部变量等
堆:由程序员分配释放,若程不释放则系统释放
1、申请内存方式
栈:由系统自动分配,如变量的声明的同时会开辟空间,(int a; 开辟4个字节的空间)(静态指定)
堆:由程序员申请,需要制定大小(动态分配)
2、系统响应的不同
栈:只要剩余空间大于申请内存,系统就会提供,否则会栈溢出
堆:便历空闲地址链表,找到符合要求的,就删除该地址分配给程序,内存的首地址记录分配的大小,(方便delete)多余的内存回收
3、空间大小不同
栈:连续的,编译时就确定的常数
堆:不连续,他的上限决定于系统中有效的虚拟内存
4、执行效率的不同
栈:由系统分配,速度快
堆:程序员分配,速度慢,容易产生内存碎片,不过用起来方便
关于C/C++内存区域划分详解的文章就介绍至此,更多相关C++内存划分内容请搜索编程宝库以前的文章,希望大家多多支持编程宝库!
一、测试对象这次测试的对象是标准库的vector,我们将会在vs2019 16.10和Linux + GCC 11.1上进行测试。为了代码写着方便,我还会启用c++17支持 ...