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

建设网站德州nba中国官方网站

建设网站德州,nba中国官方网站,jsp网站开发关键技术,直播app下载汅api免费下载文章目录 一、引用计数 (Reference Counting)二、标记-清除 (Mark-Sweep)三、标记-整理 (Mark-Compact)四、分代回收 (Generational) 一、引用计数 (Reference Counting) 原理:每个对象维护引用计数,当计数归零时释放内存。 C示例: #inclu…

文章目录

  • 一、引用计数 (Reference Counting)
  • 二、标记-清除 (Mark-Sweep)
  • 三、标记-整理 (Mark-Compact)
  • 四、分代回收 (Generational)


一、引用计数 (Reference Counting)

原理:每个对象维护引用计数,当计数归零时释放内存。

C++示例:

#include <iostream>class RefCounted {int count = 0;public:void addRef() { count++; }void release() {if (--count == 0) {delete this;}}protected:virtual ~RefCounted() = default; // 允许派生类析构
};class MyObject : public RefCounted {
public:MyObject() { std::cout << "Created\n"; }~MyObject() { std::cout << "Destroyed\n"; }
};int main() {MyObject* obj = new MyObject();obj->addRef(); // 引用计数=1obj->addRef(); // 引用计数=2obj->release(); // 引用计数=1obj->release(); // 引用计数=0,触发析构return 0;
}

缺点:无法处理循环引用(如A引用B,B引用A)。

二、标记-清除 (Mark-Sweep)

原理:从根对象出发标记所有可达对象,清除未标记的。

C++示例:

#include <iostream>
#include <vector>class GCObject {static GCObject* head;  // 全局对象链表GCObject* next = nullptr;bool marked = false;public:GCObject() { // 添加到链表next = head;head = this;}virtual ~GCObject() {}virtual void markChildren() {} // 标记引用的子对象void mark() {if (marked) return;marked = true;markChildren(); // 递归标记子对象}static void sweep() {GCObject** curr = &head;while (*curr) {GCObject* obj = *curr;if (!obj->marked) {*curr = obj->next;delete obj;} else {obj->marked = false;curr = &obj->next;}}}
};GCObject* GCObject::head = nullptr;// 根对象集合
std::vector<GCObject*> roots;class Node : public GCObject {
public:Node* child = nullptr;void markChildren() override {if (child) child->mark();}
};int main() {// 创建对象图:root -> node1 -> node2Node* node1 = new Node();roots.push_back(node1);Node* node2 = new Node();node1->child = node2;// 执行垃圾回收for (auto root : roots) root->mark();GCObject::sweep();// 手动清除根(示例中未释放roots,实际需管理生命周期)return 0;
}

缺点:内存碎片化,需暂停程序运行(Stop-the-World)。

三、标记-整理 (Mark-Compact)

原理:标记后移动存活对象至内存一端,整理后释放剩余空间。

简化示例(通过句柄间接访问对象):

#include <vector>class Object {// 假设所有对象通过Handle访问
};class Handle {Object* ptr;public:Object* get() const { return ptr; }void relocate(Object* new_ptr) { ptr = new_ptr; }
};std::vector<Handle*> handles; // 所有句柄需注册void compact(std::vector<Object*>& alive) {// 移动存活对象到新内存区域for (auto& handle : handles) {if (/* 对象存活 */) {Object* new_addr = /* 新地址 */;handle->relocate(new_addr);}}// 释放旧内存
}

缺点:对象移动需更新所有引用,实现复杂。

四、分代回收 (Generational)

原理:按对象存活时间分代(年轻代、老年代),优先回收年轻代。

简化示例

class Generation {std::vector<GCObject*> young;std::vector<GCObject*> old;void promote(GCObject* obj) {// 将对象从年轻代晋升到老年代old.push_back(obj);}public:void collectYoung() {// 标记-清除年轻代for (auto obj : young) if (isRoot(obj)) obj->mark();sweep();// 晋升存活对象for (auto obj : young) if (obj->marked) promote(obj);young.clear();}
};

优点:减少扫描范围,提升效率。

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

相关文章:

  • 免费域名申请教程独立站seo怎么做
  • 肇庆网站seo微信拓客的最新方法
  • 虎扑的网站是用什么技术做的搜索引擎优化简历
  • 博彩导航网站可以做吗个人建网站的详细步骤
  • 怎么用lofter做网站semester at sea
  • 计算机网站建设职业群网站建设需求模板
  • 动态ip地址做网站汕头网站建设公司
  • 汕头网站建设技术支持百度品牌广告是什么
  • 网站建设和销售有关吗制作网页的网站
  • 做直播网站找哪个网站网络公司主要做哪些
  • 网站建设用户画像例子百度竞价是seo还是sem
  • 用网站空间可以做有后台的网站吗宁波seo软件
  • 做导航网站不侵权吗代运营公司靠谱吗
  • 做游戏解说上传在什么网站好如何制作网页游戏
  • 浙江省建设厅网站资质迁移昆明seo排名外包
  • 丽水做网站的公司网络推广专员所需知识
  • 什么系统做购物网站好宁波seo营销
  • 网站客服是做什么的2023年新闻热点事件摘抄
  • 宝坻建设委员会网站软件开发公司推荐
  • 网站是由什么组成的朝阳区seo技术
  • 网站做vr的收费网络优化工程师骗局
  • 建立一个网站需要哪些企业建设网站公司
  • 切片工具做网站怎么做网店运营培训
  • 聊城做网站厉害的公司网上商城推广13种方法
  • php做网站后台语言如何自己开发一个平台
  • 如何利用网站新闻做推广百度网首页
  • 做网站有高手没有哈尔滨网络推广
  • 有网站如何做appseo是怎么优化
  • 个人视频网站怎么做网络营销seo是什么意思
  • 深圳网站建设i9988互联网seo是什么