当前位置: 首页 > wzjs >正文

网站关键词优化排名软件系统深圳百度推广优化

网站关键词优化排名软件系统,深圳百度推广优化,公司背景墙logo设计,魔贝课凡seo好的,我们来用一个直观的方式理解C中的堆和栈。 想象一下你正在一个大办公室(你的电脑内存)里工作: 栈 (Stack) - 你的办公桌 是什么:你的办公桌是你临时放东西、处理当前任务的地方。它有固定的大小,东西…

好的,我们来用一个直观的方式理解C++中的堆和栈。

想象一下你正在一个大办公室(你的电脑内存)里工作:

  1. 栈 (Stack) - 你的办公桌

    • 是什么:你的办公桌是你临时放东西、处理当前任务的地方。它有固定的大小,东西放上去、拿下来都很有序。
    • 特点
      • 自动管理:你开始一个新任务(调用一个函数),就在桌上腾出一块地方放这个任务的资料(函数参数、局部变量)。任务结束(函数返回),这些资料就自动被清理掉了。
      • 后进先出 (LIFO):就像你叠盘子,最后放上去的盘子最先被拿走。函数调用也是这样,最后调用的函数最先执行完毕并返回。
      • 速度快:因为管理简单(只需要移动一个指向桌子顶部的指针),分配和释放内存非常快。
      • 大小有限:你的办公桌空间是有限的(通常几MB)。
    • 什么地方用
      • 函数调用:每次调用函数,都会在栈上创建一个“栈帧”(stack frame),存放函数的参数、返回地址、局部变量等。
      • 局部变量:在函数内部定义的变量(比如 int a; char str[10];),它们的作用域只在函数内部,函数结束时自动释放。
    • 递归用的多的是什么。每次递归调用都是一个新的函数调用,都会在栈上创建一个新的栈帧。如果递归太深,办公桌就堆满了。
    • 什么时候会爆掉 (Stack Overflow - 栈溢出)
      • 无限递归或递归太深:就像你在办公桌上不停地叠文件,最终文件会塌下来。递归太深,栈空间被耗尽。
      • 在栈上分配了过大的局部变量:比如你在函数里定义了一个超大的数组 int big_array[1000000];,直接把办公桌占满了。
  2. 堆 (Heap) - 办公室的储藏室/仓库

    • 是什么:储藏室是你可以按需申请空间存放东西的地方。这个空间很大,但你需要自己去申请(new),并且用完后要自己记得去归还(delete),否则储藏室会越来越乱,最后没地方放新东西。
    • 特点
      • 手动管理:你需要显式地通过 new (或 malloc) 申请内存,并通过 delete (或 free) 释放内存。
      • 灵活:可以在程序运行时动态决定需要多大的内存,并且这块内存的生命周期可以不受函数调用的限制(可以跨函数存在)。
      • 速度相对慢:分配和释放内存比栈要复杂,需要查找合适的空闲块,所以速度慢一些。
      • 空间大:通常堆的空间远大于栈,取决于可用的系统内存。
    • 什么地方用
      • 动态分配内存:当你在编译时不知道需要多少内存,或者需要的数据量比较大(不适合放栈上),或者希望数据在函数结束后依然存在时。例如:
        int* arr = new int[size]; // size 是运行时决定的
        MyClass* obj = new MyClass();
        
      • 创建生命周期长的对象:对象需要在创建它的函数返回后依然被其他部分代码访问。
    • 什么时候会爆掉 (Heap Exhaustion / Out of Memory - 堆耗尽)
      • 内存泄漏 (Memory Leak):你不停地从储藏室拿空间 (new),但从不归还 (delete)。最终储藏室被用完,新的申请就会失败。
      • 申请过大的内存块:即使储藏室还有很多零散空间,但如果你一次性要一个超级大的连续空间,可能也找不到,导致分配失败。
      • 堆碎片化 (Heap Fragmentation):频繁申请和释放小块内存,可能导致堆中有很多不连续的小空闲块。虽然总的空闲空间可能够,但没有足够大的 连续 空间来满足某个较大的分配请求。
  3. 为什么会分这些?

    • 管理方式不同:栈的自动管理非常高效,适合生命周期短、大小固定的数据。堆的手动管理提供了更大的灵活性,但牺牲了速度和增加了程序员的责任。
    • 效率和灵活性权衡
      • 栈追求的是效率简单性,用于函数调用和局部作用域。
      • 堆追求的是灵活性,用于动态生命周期和大小不定的数据。
    • 防止内存混乱:将这两种不同使用模式的内存分开,有助于操作系统和程序更有效地管理内存。
  4. 一堆静态变量 (Static Variables) 用的多的是什么?

    • 静态变量(包括全局变量和用 static 修饰的局部变量)既不在栈上,也不在堆上
    • 它们存储在内存的另一个特定区域,通常称为 静态存储区/全局存储区 (Static/Global Storage Area) 或者有时细分为 .data 段 (已初始化的静态/全局变量) 和 .bss 段 (未初始化或初始化为0的静态/全局变量)。
    • 特点
      • 生命周期:从程序开始运行到程序结束。
      • 作用域:全局变量在整个程序中可见(除非被文件内的 static 限制),static 局部变量只在定义它的函数内可见,但其值在函数多次调用间保持。
    • 什么时候会爆掉
      • 严格来说,静态存储区的大小在编译链接时就基本确定了。如果定义了过多的、非常大的静态/全局变量,可能会导致程序映像文件过大,加载时就可能出问题(比如内存不足以加载整个程序)。运行时一般不会像栈溢出或堆耗尽那样“爆掉”,因为它的空间是预先分配好的。但如果你滥用,比如一个静态指针指向一个巨大的堆分配内存,那还是堆可能爆掉。

总结一下:

特性栈 (Stack) - 办公桌堆 (Heap) - 储藏室静态/全局区 - 公司的固定资产柜
管理自动 (编译器)手动 (new/delete)自动 (程序加载时分配,结束时释放)
速度相对慢-
大小小,固定 (OS分配)大,灵活 (受限于系统可用内存)编译时确定
生命周期函数调用期间,局部作用域手动控制,可跨函数整个程序运行期间
存放函数参数、局部变量、返回地址动态分配的对象/数据全局变量、静态变量
主要用途函数调用机制、临时数据大对象、生命周期不确定的数据程序运行期间一直需要的数据
递归用非常多较少直接用于递归本身(但递归函数内可以分配堆内存)-
“爆掉”栈溢出 (Stack Overflow) - 递归太深、局部变量太大堆耗尽 (Out of Memory) - 内存泄漏、申请过大/碎片化程序过大无法加载

希望这个办公室的类比能帮助你更好地理解!

http://www.dtcms.com/wzjs/52319.html

相关文章:

  • 如何做好网站建设的设计布局搜狗友链交换
  • 怎么备份wordpress网站百度提交收录入口
  • 南昌网站做网站排名优化怎么做
  • 做产品目录的网站微博推广平台
  • 肃宁网站制作价格宣传网页制作
  • 甘肃省省建设厅网站怎么制作网页
  • 长沙制作公园仿竹护栏seo的范畴是什么
  • 阿里巴巴网站建设教程福州百度快速优化排名
  • 网站后台更新站长统计ios
  • 桓台网站开发阿里巴巴怎么优化关键词排名
  • 网站建设投票系统总结网站新域名查询
  • 医院营销策略的具体方法厦门搜索引擎优化
  • 什么网站可以免费做视频的软件免费注册网址
  • 大兴网站开发公司英语seo
  • 外贸网站推广平台哪个好搜索引擎优化的流程
  • 做网站的图片传进去很模糊百度一键安装
  • 重庆光龙网站建设网络优化工程师工作内容
  • 县区社保经办网站建设今日热搜前十名
  • 杰奇网站地图插件东莞seo外包
  • 地方门户信息网站建设方案南京seo排名
  • 做网站的成本有多少钱seo优化方式包括
  • 电话语音聊天网站建设多少钱百度推广代理商名单
  • 域名解析到别的网站seo网站推广推荐
  • 邯郸信息网平台seo零基础视频教程
  • 招商平台公司长沙seo服务哪个公司好
  • 可以免费注册的网站东莞百度seo
  • 企业做网站设计在线培训网站
  • 网站界面设计尺寸百度搜索资源
  • 国内大宗商品交易平台seo网站排名全选
  • 做视频开头动画网站商丘seo优化