操作系统管理内存对比表
栈(stack) | 堆(heap) | 数据区(.data) | |||
---|---|---|---|---|---|
代码段 | 数据段 | bss段 | |||
存放类型 | 普通局部变量 | 用户使用内存比较大,需要反复使用和释放。(链表、结构体会使用堆管理内存) | 程序中的可执行部分,也可以理解代码段就是函数堆叠组成的 | C语言程序中的全局变量 | C语言程序中的全局变量 |
特点 | 应用程序在操作系统中运行时,操作系统分配一块栈空间给应用程序使用。栈大小由操作系统决定的。栈指针是由操作系统控制(栈的先进后出特性) | 操作系统堆管理器管理:堆管理器是操作系统的一块模块,堆管理内存分配灵活,按需分配。 | 存放显示初始化为非零的全局变量。 | 存放显示初始化为0或者没有显示初始化的全局变量 | |
栈是在运行时自动分配和自动收回:栈是自动管理的、程序员不需要手工干预。 | 程序手动申请和释放:需要程序员写代码去申请malloc和释放free。 | ||||
反复使用:栈内存在程序中其实就是一块空间,程序反复使用这一块空间。 | 大块内存:堆内存管理者总量很大的操作系统内存块,各程序按需向操作系统去申请,使用完之后要释放。 | ||||
脏内存:由于栈是反复使用的,每次使用后程序不会清理,因此分配到时保留原来的值 | 脏内存:堆内存也是反复使用的,使用者用完释放前不会清除。 | ||||
临时性:变量在栈上只是临时分配了一个内存空间使用 | 临时性:堆内存只有在malloc和free之间属于这个进程,可以访问。 | ||||
栈会溢出:操作系统分配的栈大小是有限的。大量使用栈会造成栈溢出。 | 堆申请内存容量不限。但如果申请的内存没有释放,就会造成内存泄漏。 | ||||
特殊字符 | C语言中使用char *p=“linux”; 定义字符串,这个字符串不会被放在数据段,而是会被分配为代码段。 这个字符串属于常量字符串而不是变量字符串。 | ||||
const型常量,C语言中const关键字用来定义常量,常量就是不能被改变的量。 const类型实现方法: 1、单片机的编译器编译将const修饰的变量放在代码段去实现不能修改 2、gcc编译器是用来检查const类型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的。 | |||||
优点 | C语言中栈的操作是方便的。分配和最后的回收栈空间不需要程序员去操心。C语言自动完成。 | 使用自由(随时申请、释放,大小可随意)。 | |||
缺点 | 栈是有长度的。栈内存不灵活,大小不好设置。(如果栈太小怕溢出,栈太大浪费) 在C语言中定义局部变量时不能定义太大,如数组成员不能太大int a[1000000]; | 申请malloc和释放free都需要程序员写代码手动实现。如果申请的内存没有释放,就会造成内存泄漏。 |