⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9_2_2 用户层垃圾回收算法的实现 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm

📁 主要介绍了多任务下面的一些数据结构和算法,比如树和图的一些遍历
💻 HTM
📖 第 1 页 / 共 5 页
字号:
style="FONT-SIZE: 9pt">               
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 13.8pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=4 style="LINE-HEIGHT: 13.8pt"><STRONG><SPAN 
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><STRONG><SPAN style="FONT-FAMILY: 华康简宋">~</SPAN><SPAN 
lang=EN-US>GCPtr()</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 13.8pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 13.8pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
T *p = m_pAddr</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 13.8pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
INT *p = (INT *)m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 8pt; LINE-HEIGHT: 14pt"><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">}</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">以上编码便是使用</SPAN><SPAN 
lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">类管理引用计数的一个初步实现,当然这里只是为了演示一下如何管理引用计数,并不是全部功能的实现。具体应用中还有许多操作符需要重载,将在后面进行介绍。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>4. </SPAN><SPAN 
style="FONT-FAMILY: 黑体">构造函数和析构函数的说明</SPAN></H4>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">可以看到在</SPAN><SPAN 
lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">的构造函数中,直接由内存地址定位到存放引用计数的位置,将引用计数加</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">。</SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">析构函数要做的事情也很简单,就是当一个</SPAN><SPAN 
lang=EN-US style="LETTER-SPACING: 0.1pt">GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">类型的变量释放时,直接由要释放的内存地址</SPAN><SPAN 
lang=EN-US style="LETTER-SPACING: 0.1pt">(</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">已经存放到</SPAN><SPAN lang=EN-US 
style="LETTER-SPACING: 0.1pt">m_pAddr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">中</SPAN><SPAN lang=EN-US 
style="LETTER-SPACING: 0.1pt">)</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">定位到存放引用计数的位置,将引用计数减</SPAN><SPAN 
lang=EN-US style="LETTER-SPACING: 0.1pt">1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">。</SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">这种方法在修改引用计数时效率非常高,与哈希表相比无需查表等操作。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>5. </SPAN><SPAN 
style="FONT-FAMILY: 黑体">需要修改引用计数的情况</SPAN></H4>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">实际上,不仅仅是构造函数和析构函数要修改引用计数,牵涉指针的操作基本上都需要修改引用计数,主要有以下三种情况。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">当将新地址赋给</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">时,需要将原来地址的引用计数减</SPAN><SPAN lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">,新的地址的引用计数加</SPAN><SPAN lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">,这时需要重载运算符“</SPAN><SPAN lang=EN-US>=</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">”号。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">当将一个</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">赋给另外一个</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">时,需要将等号左边的</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">指向的内存块的引用计数减</SPAN><SPAN lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">,等号右边的</SPAN><SPAN lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">指向的内存块的引用计数加</SPAN><SPAN lang=EN-US>1</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>3) </SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">当需要对象的副本时,需要调用</SPAN><SPAN 
lang=EN-US>GCPtr</SPAN><SPAN 
style="FONT-FAMILY: 华康简宋">的拷贝构造函数,如将对象当作参数传递给函数,作为函数的返回值等情况都会调用拷贝构造函数。由于复制的对象是指向相同的地址,而复制对象在释放时要调用析构函数,析构函数将引用计数减</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,因此需要在拷贝函数里加</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">以维持引用计数的平衡。</SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 华康简宋">下面给出这几个操作的编码,由于构造函数和析构函数等在前面已经给出,所以这里省略。</SPAN></P>
<P class=4><SPAN lang=EN-US>template &lt;class T&gt; class <STRONG>GCPtr 
</STRONG>{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">public</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">:</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T 
*m_pAddr</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; /* </SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">用来记住定义的指针地址便于析构函数使用</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">public</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">:</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 
</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">拷贝构造函数</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">GCPtr(const GCPtr 
&amp;gcPtr)</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
INT *p = (INT *)gcPtr.m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pAddr = gcPtr.m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">T *operator=(T 
*t) </SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/* </SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将原来指向的内存引用计数减</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
INT *p = (INT *)m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pAddr = t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/* </SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将新指向的内存的引用计数加</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
p = (INT *)t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">GCPtr &amp; 
operator = (GCPtr &amp;r) </SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{ </SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/* </SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将原来指向的内存引用计数减</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
INT *p = (INT *)m_pAddr</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US 
style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN 
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -