抽象是计算机领域的最重要的概念。抽象就是把复杂的东西用一个简单的东西包装起来使用。
比如进程是对正在运行程序的抽象,使程序感觉起来它就像计算机只运行了它一个程序,CPU、内存、IO专供它调用。而虚拟内存就是正在运行程序的内存的抽象,让每个程序感觉自己“独占”了计算机内存。所以每个程序的虚拟内存空间是一样的!
点击查看【processon】
- 代码区(.text段):存储函数代码
- 全局区
- .data段,存储未初始化的全局/静态变量。
- .bss段,存储已初始化全局/静态变量。
- 堆(heap):动态内存区域,动态申请的内存空间。
- 栈(stack):栈内存区域,存放函数局部变量、函数参数、返回地址。
- 内核区(kernel):禁止访问。
#include <iostream>
using namespace std;
// C++中,初始化和未初始化全局变量、静态变量的存储区(.data段和.bss段)
int g_var = 0; // 全局区(.data段),这是全局变量(在函数外声明的变量)
char *gp_var; // 全局区(.bss段)
int main(){
int var; // 栈区
char *p_var; // 栈区
char arr[] = "abc"; // arr数组在栈区,"abc"是字符串常量,在全局区(.data段)
char *p_var1 = "123456"; // 同上。
static int s_var = 0; // s_var在全局区(.data段),静态变量(static声明的变量)
p_var = (char *)malloc(10); // p_var在栈区,动态分配的内存在堆区
free(p_var); // 释放动态内存。
return 0;
}
堆和栈的区别
堆和栈可能是数据结构,可能是内存区域。
- 数据结构
- 堆:二叉树结构,最大/小值堆(堆排序)。
- 栈:先进后出的数据结构
- 内存区域
- 申请方式
- 堆:程序员主动申请。
- 栈:系统自动分配。
- 申请后响应
- 栈:空间足够则分配成功,否则栈溢出。空间是连续的,最大容量是系统预定好的
- 堆:链表的数据结构,每个节点代表一个空闲空间地址,从表头开始找到第一个大于申请空间的节点,将节点删除,一般情况目标空间的首地址存放的是本次分配空间的大小,目标空间剩余部分会再次连接到链表上,就是这个空间被分割成了两部分。空间不是连续的。(向高地址扩展)
- 申请效率
- 栈,由系统自动分配,效率很高,程序员无法控制。
- 栈,由程序员主动分配,效率低,容易产生碎片。
- 存放内容
- 栈存放的是局部变量
- 堆的内容由程序员控制。
- 申请方式