抽象是计算机领域的最重要的概念。抽象就是把复杂的东西用一个简单的东西包装起来使用。
比如进程是对正在运行程序的抽象,使程序感觉起来它就像计算机只运行了它一个程序,CPU、内存、IO专供它调用。而虚拟内存就是正在运行程序的内存的抽象,让每个程序感觉自己“独占”了计算机内存。所以每个程序的虚拟内存空间是一样的!
点击查看【processon】

  • 代码区(.text段):存储函数代码
  • 全局区
    • .data段,存储未初始化的全局/静态变量。
    • .bss段,存储已初始化全局/静态变量。
  • 堆(heap):动态内存区域,动态申请的内存空间。
  • 栈(stack):栈内存区域,存放函数局部变量、函数参数、返回地址。
  • 内核区(kernel):禁止访问。
  1. #include <iostream>
  2. using namespace std;
  3. // C++中,初始化和未初始化全局变量、静态变量的存储区(.data段和.bss段)
  4. int g_var = 0; // 全局区(.data段),这是全局变量(在函数外声明的变量)
  5. char *gp_var; // 全局区(.bss段)
  6. int main(){
  7. int var; // 栈区
  8. char *p_var; // 栈区
  9. char arr[] = "abc"; // arr数组在栈区,"abc"是字符串常量,在全局区(.data段)
  10. char *p_var1 = "123456"; // 同上。
  11. static int s_var = 0; // s_var在全局区(.data段),静态变量(static声明的变量)
  12. p_var = (char *)malloc(10); // p_var在栈区,动态分配的内存在堆区
  13. free(p_var); // 释放动态内存。
  14. return 0;
  15. }

堆和栈的区别

堆和栈可能是数据结构,可能是内存区域。

  • 数据结构
    • 堆:二叉树结构,最大/小值堆(堆排序)。
    • 栈:先进后出的数据结构
  • 内存区域
    • 申请方式
      • :程序员主动申请。
      • :系统自动分配。
    • 申请后响应
      • 栈:空间足够则分配成功,否则栈溢出。空间是连续的,最大容量是系统预定好的
      • :链表的数据结构,每个节点代表一个空闲空间地址,从表头开始找到第一个大于申请空间的节点,将节点删除,一般情况目标空间的首地址存放的是本次分配空间的大小,目标空间剩余部分会再次连接到链表上,就是这个空间被分割成了两部分。空间不是连续的。(向高地址扩展)
    • 申请效率
      • 栈,由系统自动分配,效率很高,程序员无法控制。
      • ,由程序员主动分配,效率低,容易产生碎片。
    • 存放内容
      • 栈存放的是局部变量
      • 堆的内容由程序员控制。