﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Khan's Notebook    GCC/GNU/Linux Delphi/Window Java/Anywhere</title><link>http://www.cppblog.com/Khan/</link><description>路漫漫，长修远，我们不能没有钱</description><language>zh-cn</language><lastBuildDate>Sat, 11 Apr 2026 06:56:34 GMT</lastBuildDate><pubDate>Sat, 11 Apr 2026 06:56:34 GMT</pubDate><ttl>60</ttl><item><title>android 上的家用机模拟器</title><link>http://www.cppblog.com/Khan/archive/2025/04/11/230434.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 11 Apr 2025 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2025/04/11/230434.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/230434.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2025/04/11/230434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/230434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/230434.html</trackback:ping><description><![CDATA[<div>&nbsp;xxx.emu系列&nbsp;<a style="color: " href="https://github.com/Rakashazi/emu-ex-plus-alpha">https://github.com/Rakashazi/emu-ex-plus-alpha</a>&nbsp;&nbsp;中规中矩 没有分辨率提升特性, 但兼容性还不错<br />&nbsp;<br />&nbsp;sony psp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ppsspp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a style="color: " href="https://github.com/hrydgard/ppsspp">https://github.com/hrydgard/ppsspp</a><br />&nbsp;sony ps1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; duckstation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a style="color: " href="https://github.com/stenzek/duckstation">https://github.com/stenzek/duckstation</a><br />&nbsp;sony ps1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; epsxe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <a href="https://www.epsxe.com">https://www.epsxe.com</a><br />&nbsp;sega DC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flycast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a style="color: " href="https://github.com/flyinghead/flycast">https://github.com/flyinghead/flycast</a><br />&nbsp;sega saturn&nbsp;&nbsp; Yaba Sanshiro2&nbsp; <a href="https://www.yabasanshiro.com">https://www.yabasanshiro.com</a>&nbsp;<a style="color: " href="https://github.com/devmiyax/yabause">https://github.com/devmiyax/yabause</a>&nbsp; 兼容性一般</div><img src ="http://www.cppblog.com/Khan/aggbug/230434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2025-04-11 15:01 <a href="http://www.cppblog.com/Khan/archive/2025/04/11/230434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于CppBlog首页CSS样式丢失问题解决办法</title><link>http://www.cppblog.com/Khan/archive/2024/04/30/230338.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 30 Apr 2024 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2024/04/30/230338.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/230338.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2024/04/30/230338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/230338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/230338.html</trackback:ping><description><![CDATA[管理-&gt;选项-&gt;Configure 的 首页HTML代码中写入
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">link&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="MainCss"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text/css"</span><span style="color: #ff0000">&nbsp;rel</span><span style="color: #0000ff">="stylesheet"</span><span style="color: #ff0000">&nbsp;href</span><span style="color: #0000ff">="https://www.cppblog.com/Skins/AnotherEon001/style.css"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div><br />应该是某位大佬加了https证书后忘记将页面内的css样式链接改成https了, 导致该资源被浏览器拦截<img src ="http://www.cppblog.com/Khan/aggbug/230338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2024-04-30 16:54 <a href="http://www.cppblog.com/Khan/archive/2024/04/30/230338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Atomic</title><link>http://www.cppblog.com/Khan/archive/2022/10/14/229444.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 14 Oct 2022 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2022/10/14/229444.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/229444.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2022/10/14/229444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/229444.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/229444.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++ Atomicatomic&nbsp;是STL(标准库)中的一个头文件, 定义了 C++11标准中的一些表示&nbsp;线程并发控制&nbsp;时&nbsp;原子操作&nbsp;的类与方法. 主要声明了两个类模板:&nbsp;std::atomic&nbsp;和&nbsp;std::atomic_flag, 另外还声明了一套C风格的原子类型&nbsp;与 C兼容的原子操作的函数.在多...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2022/10/14/229444.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/229444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2022-10-14 16:36 <a href="http://www.cppblog.com/Khan/archive/2022/10/14/229444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apple M1 arm cpu下 同时编译arm64 与 x86_64的方法</title><link>http://www.cppblog.com/Khan/archive/2022/10/14/229441.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 14 Oct 2022 03:33:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2022/10/14/229441.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/229441.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2022/10/14/229441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/229441.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/229441.html</trackback:ping><description><![CDATA[<div><br />
</div>
<div>autotools
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">mkdir</span>&nbsp;build&nbsp;&amp;&amp;&nbsp;cd&nbsp;build<br />
../configure&nbsp;CFLAGS=<span style="font-weight: bold;">'</span><span style="font-weight: bold;">-arch&nbsp;arm64&nbsp;-arch&nbsp;x86_64</span><span style="font-weight: bold;">'</span>&nbsp;CXXFLAGS=<span style="font-weight: bold;">'</span><span style="font-weight: bold;">-arch&nbsp;arm64&nbsp;-arch&nbsp;x86_64</span><span style="font-weight: bold;">'</span>&nbsp;LDFLAGS=<span style="font-weight: bold;">"</span><span style="font-weight: bold;">-arch&nbsp;arm64&nbsp;-arch&nbsp;x86_64</span><span style="font-weight: bold;">"</span>&nbsp;--prefix&nbsp;/Users/khan/Downloads/testdisk-<span style="color: #800000; ">7.2</span>-WIP_src/build/dist</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>cmake&nbsp;</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">mkdir</span>&nbsp;build&nbsp;&amp;&amp;&nbsp;cd&nbsp;build<br />
cmake&nbsp;-DCMAKE_OSX_ARCHITECTURES=<span style="font-weight: bold;">'</span><span style="font-weight: bold;">armv7;arm64;x86_64</span><span style="font-weight: bold;">'</span>&nbsp;..&nbsp;</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>qmake&nbsp;</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#&nbsp;设置变量<br />
QMAKE_APPLE_DEVICE_ARCHS&nbsp;=&nbsp;x86_64&nbsp;arm64</div>
</div>
</div><img src ="http://www.cppblog.com/Khan/aggbug/229441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2022-10-14 11:33 <a href="http://www.cppblog.com/Khan/archive/2022/10/14/229441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt for Mac DeveloperId 打包 签名 公证 盖章</title><link>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 07 Jan 2022 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/224697.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/224697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/224697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下脚本根据QCreator for mac工程的输出二进制文件 进行打包 部署 签名 上传公证 签章可在工程目录下新建一个 deployed目录, 并将脚本拷贝到该目录下执行, 执行需要root权限支持cmake工程或qmake工程此脚本不含编译部分, 需要自行编译, 编译成功后方可成功执行cd $projectDir &amp;&amp; mkdir deployed&...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/224697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2022-01-07 12:14 <a href="http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QtCreator中如何使用Conan包管理工具</title><link>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 19 Oct 2021 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217838.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要点    Conan本身是一个包管理工具, 类似Pyhon的pip, 本身用Python编写    QT 6.0 开始引入Conan插件, 从个人观察来看, 似乎该插件仅仅引入了cmake脚本文件    Conan本身不依赖QtCreator, 可以随意使用, 其他编译环境可以忽略掉本文章所有关于QT的内容, 其他不变一 准备环境, 安装Conan1.1 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2021/10/19/217838.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/217838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-10-19 16:09 <a href="http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 和 windows下 获取主机网卡mac地址</title><link>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 03 Jun 2021 09:42:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217702.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217702.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000">#ifndef&nbsp;__EHTERNET_HPP__<br /></span><span style="color: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;__EHTERNET_HPP__</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(WIN32)&nbsp;||&nbsp;defined(_WIN32)&nbsp;||&nbsp;defined(__WIN32__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_WIN32</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#elif</span><span style="color: #000000">&nbsp;defined(linux)&nbsp;||&nbsp;defined(__linux)&nbsp;||&nbsp;defined(__linux__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_LINUX</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;10</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;11</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;12</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;13</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">winsock2.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;14</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iphlpapi.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;15</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;16</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;17</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;18</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">socket.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;19</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;linux/if.h&gt;<br /></span><span style="color: #008080">&nbsp;20</span>&nbsp;<span style="color: #008000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;net/if.h&gt;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;21</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">ioctl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;22</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;23</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;24</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;25</span>&nbsp;<span style="color: #000000">std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;operstatusToStr(IF_OPER_STATUS&nbsp;status){<br /></span><span style="color: #008080">&nbsp;26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">(status){<br /></span><span style="color: #008080">&nbsp;27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUp:<br /></span><span style="color: #008080">&nbsp;28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">up</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDown:<br /></span><span style="color: #008080">&nbsp;30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">down</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusTesting:<br /></span><span style="color: #008080">&nbsp;32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">testing</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUnknown:<br /></span><span style="color: #008080">&nbsp;34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDormant:<br /></span><span style="color: #008080">&nbsp;36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">dormant</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusNotPresent:<br /></span><span style="color: #008080">&nbsp;38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">notPresent</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusLowerLayerDown:<br /></span><span style="color: #008080">&nbsp;40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sLowerLayerDown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;43</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;44</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;45</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;47</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;family&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AF_UNSPEC;</span><span style="color: #008000">//</span><span style="color: #008000">返回包括&nbsp;IPV4&nbsp;和&nbsp;IPV6&nbsp;地址</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;49</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;flags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_PREFIX&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_GATEWAYS;</span><span style="color: #008000">//</span><span style="color: #008000">包括&nbsp;IPV4&nbsp;，IPV6&nbsp;閘道器</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;50</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;outBufLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(IP_ADAPTER_ADDRESSES)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;52</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;54</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IP_ADAPTER_ADDRESSES&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)malloc(outBufLen);<br /></span><span style="color: #008080">&nbsp;58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br /></span><span style="color: #008080">&nbsp;59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">&nbsp;60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetAdaptersAddresses(family,&nbsp;flags,&nbsp;NULL,&nbsp;pAddresses,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">outBufLen);<br /></span><span style="color: #008080">&nbsp;61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW)&nbsp;{<br /></span><span style="color: #008080">&nbsp;62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(pAddresses);<br /></span><span style="color: #008080">&nbsp;63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW);<br /></span><span style="color: #008080">&nbsp;68</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NO_ERROR)&nbsp;{<br /></span><span style="color: #008080">&nbsp;70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pAddresses;<br /></span><span style="color: #008080">&nbsp;71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(pCurrAddresses)&nbsp;{<br /></span><span style="color: #008080">&nbsp;72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddressLength&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OperStatus&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;IfOperStatusUp){<br /></span><span style="color: #008080">&nbsp;74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;type[</span><span style="color: #000000">8</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">0</span><span style="color: #000000">};<br /></span><span style="color: #008080">&nbsp;75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">IfType){&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网卡类型</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;76</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_ETHERNET:<br /></span><span style="color: #008080">&nbsp;77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">eth</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_PPP:<br /></span><span style="color: #008080">&nbsp;80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ppp</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;82</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_LOOPBACK:<br /></span><span style="color: #008080">&nbsp;83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">loop</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_SLIP:<br /></span><span style="color: #008080">&nbsp;86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">atm</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;87</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;88</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IF_TYPE_IEEE80211:<br /></span><span style="color: #008080">&nbsp;89</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">wifi</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;90</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;91</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;92</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;93</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;acMAC[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">&nbsp;94</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(acMAC,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">1</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;95</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">2</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">3</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;96</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">&nbsp;97</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;acMAC&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;98</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;99</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">100</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">101</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">102</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Next;<br /></span><span style="color: #008080">103</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">104</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">105</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">106</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">107</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">108</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">109</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses)&nbsp;free(pAddresses);<br /></span><span style="color: #008080">110</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">111</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">112</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">113</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">114</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">115</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">){<br /></span><span style="color: #008080">116</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sock,&nbsp;if_count,&nbsp;i;<br /></span><span style="color: #008080">117</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf&nbsp;ifc;<br /></span><span style="color: #008080">118</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq&nbsp;ifr[</span><span style="color: #000000">10</span><span style="color: #000000">];<br /></span><span style="color: #008080">119</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;mac[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">120</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">121</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf));<br /></span><span style="color: #008080">122</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_DGRAM,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br /></span><span style="color: #008080">123</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">124</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq);<br /></span><span style="color: #008080">125</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)ifr;<br /></span><span style="color: #008080">126</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">127</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取所有网卡信息</span><span style="color: #008000"><br /></span><span style="color: #008080">128</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ioctl(sock,&nbsp;SIOCGIFCONF,&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc);<br /></span><span style="color: #008080">129</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;if_count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq));<br /></span><span style="color: #008080">130</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;if_count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">131</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ioctl(sock,&nbsp;SIOCGIFHWADDR,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifr[i])&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">132</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;(ifr[i].ifr_flags&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;IFF_RUNNING)&nbsp;){<br /></span><span style="color: #008080">133</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(mac,&nbsp;ifr[i].ifr_hwaddr.sa_data,&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">);<br /></span><span style="color: #008080">134</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(mac,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">1</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">2</span><span style="color: #000000">]),<br /></span><span style="color: #008080">135</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">3</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">136</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;mac&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">137</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("eth:&nbsp;%s,&nbsp;mac:&nbsp;%02x:%02x:%02x:%02x:%02x:%02x\n",&nbsp;ifr[i].ifr_name,&nbsp;mac[0],&nbsp;mac[1],&nbsp;mac[2],&nbsp;mac[3],&nbsp;mac[4],&nbsp;mac[5]);</span><span style="color: #008000"><br /></span><span style="color: #008080">138</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">139</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">140</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">141</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">142</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">143</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">144</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">145</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">146</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">147</span>&nbsp;<span style="color: #000000"></span></div><br />调用方式<br /><br /><span style="color: #c0c0c0">&nbsp;&nbsp;&nbsp; </span><span style="color: #800080">std</span>::<span style="color: #800080">string</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>;<pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #00677c">GetMacByGetAdaptersAddresses</span>(<span style="color: #092e64; font-style: italic">macs</span>,<span style="color: #c0c0c0"> </span><span style="color: #808000">true</span>);</pre><pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #000080">qDebug</span>()<span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #000080">TIMESTAMP</span><span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>.<span style="color: #00677c">c_str</span>();</pre><br /><br /><br /><img src ="http://www.cppblog.com/Khan/aggbug/217702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-06-03 17:42 <a href="http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ChaCha20 加密 算法 c++11实现</title><link>http://www.cppblog.com/Khan/archive/2021/06/03/217701.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 03 Jun 2021 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/06/03/217701.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217701.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/06/03/217701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217701.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ChaCha20 加密/解密算法, 支持单轮多轮加密Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;#ifndef&nbsp;CHACHA20_H&nbsp;&nbsp;2&nbsp;#define&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2021/06/03/217701.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/217701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-06-03 17:38 <a href="http://www.cppblog.com/Khan/archive/2021/06/03/217701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SHA256 算法c++11 实现</title><link>http://www.cppblog.com/Khan/archive/2021/06/03/217700.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 03 Jun 2021 09:31:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/06/03/217700.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217700.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/06/03/217700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: c++11 sha256&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2021/06/03/217700.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/217700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-06-03 17:31 <a href="http://www.cppblog.com/Khan/archive/2021/06/03/217700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 C++ 中实现一个轻量的标记清除 gc 系统(转载)</title><link>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 01 Aug 2019 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/216620.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/216620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/216620.html</trackback:ping><description><![CDATA[<div># 在 C++ 中实现一个轻量的标记清除 gc 系统<br /></div><div></div><div>[引用](https://blog.codingnow.com/2010/02/cpp_gc.html)<br /></div><div></div><div></div><div>最近想把 engine 做一个简单 C++ 封装，结合 QT 使用。engine 本身是用纯 C 实现的，大部分应用基于 lua 开发。对对象生命期管理也依赖 lua 的 gc 系统。关于这部分的设计，可以参考我以前写的一篇 为 lua 封装 C 对象的生存期管理问题 。<br /></div><div></div><div>当我们把中间层搬到 C++ 中时，遇到的问题之一就是，C++ 没有原生的 gc 支持。我也曾经写过一个 gc 库。但在特定应用下还不够简洁。这几天过年休息，仔细考虑了一下相关的需求，尝试实现了一个更简单的 gc 框架。不到 200 行代码吧，我直接列在这篇 blog 里。<br /></div><div></div><div>这些尚是一些玩具代码，我花了一天时间来写。有许多考虑不周的地方，以及不完整的功能。但可以阐明一些基本思路。<br /></div><div></div><div>首先我需要一个`标记清除`的 `gc系统`，用来解决`引用记数`不容易解决的`循环引用`问题。它的实现不想比`引用记数`复杂太多，并有相同甚至更高的性能。<br /></div><div></div><div>我不想使用复杂的 template 技术，利用太多的语法糖让使用看起来简单。如果需要让这些 C++ 代码看起来更现代，更有&#8220;品味&#8221;，我想也不是很难的事情。<br /></div><div></div><div>接口和实现希望尽量分离，对用的人少暴露细节。但不拘泥于教条，强求做成类似 COM 那样的通用 ABI 。还是尽量利用 C++ 语言本身提供的机制，不滥用。<br /></div><div></div><div>使用尽量简单，不要让使用人员有太大负担。<br /></div><div></div><div>功能满足最低需求即可。代码容易阅读，使用人员可以很快理解原理，不至于误用。也方便日后扩展以适应新的需求。<br /></div><div></div><div>代码如下：</div><div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;filename:&nbsp;i_gcobject.h&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;as&nbsp;listed&nbsp;at&nbsp;.&nbsp;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;};&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div><div><br /></div><div>所有支持 `gc管理的接口`都继承至 `i_gcobject` ，提供三个方法:<br /></div><div></div><div>* mark 可以把这个对象打上标记，被标记的对象将不会被 collect 回收。</div><div></div><div>* grab 将对象挂接到一个被称呼为 root 的特殊 gcobject 上。</div><div></div><div>* release 将对象从 root 上取掉。<br /></div><div></div><div>另提供 touch 的模板方法供 mark 回调，用来标记同一对象中的不同部分。</div><div></div><div>mark 方法一般在 touch 方法中使用，另外，collect 方法将主动调用 root 的 mark 。<br /></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcholder.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">21</span>&nbsp;};<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div>`i_gcholder` 为 root 的接口，提供 `hold` 和 `unhold` 方法来挂接需要持久保留的 gcobject 。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();<br /><span style="color: #008080; ">26</span>&nbsp;};<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;gc_object_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;gc_object_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcobject&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;marked;<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;gcobject();<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark();<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab();<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release();<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_unmarked;<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;};<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">#endif</span><br /><span style="color: #008080; ">30</span>&nbsp;```<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;```c++<br /><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.cpp&nbsp;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">44</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">45</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">46</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;gc_trigger;<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;std::vector&lt;gcobject&nbsp;*&gt;&nbsp;gc_pool;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;gc_root&nbsp;=&nbsp;i_gcholder::create();<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;gcobject::f_unmarked&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(gcobject&nbsp;*&nbsp;value)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unmarked&nbsp;=&nbsp;value-&gt;marked&nbsp;!=&nbsp;gc_trigger;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(unmarked)&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;value;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;unmarked;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;};<br /><span style="color: #008080; ">62</span>&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;gcobject::gcobject()&nbsp;:&nbsp;marked(!gc_trigger)&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;gc_pool.push_back(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;<br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::mark()&nbsp;{<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(marked&nbsp;!=&nbsp;gc_trigger)&nbsp;{<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marked&nbsp;=&nbsp;gc_trigger;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touch();<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;<br /><span style="color: #008080; ">74</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::grab(){<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;hold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">76</span>&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;<br /><span style="color: #008080; ">78</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::release(){<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;unhold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">80</span>&nbsp;}<br /><span style="color: #008080; ">81</span>&nbsp;<br /><span style="color: #008080; ">82</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;i_gcobject::collect()&nbsp;{<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;mark();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;gc_pool.erase(remove_if(gc_pool.begin(),&nbsp;gc_pool.end()&nbsp;,&nbsp;gcobject::f_unmarked()),&nbsp;gc_pool.end());<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;gc_trigger&nbsp;=&nbsp;!gc_trigger;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div></div><div></div><div></div><div>gcobject 为具体的 gc 实现，实现了 `mark` 、`grab`、`release` 和 `collect` 方法。</div><div></div><div>`mark` 采用的直接向一 bool 变量设置标记。这个标记利用了 `trigger` 这个乒乓开关，每次 `collect` 都会切换状态。</div><div></div><div>`grab` 和 `release` 可以把对象挂接到 root 上，或从上取掉。</div><div></div><div>`collect` 会主动从 root 开始 `mark` ，并释放那些没有 `mark` 的对象。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcholder.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">15</span>&nbsp;#include&nbsp;&lt;cassert&gt;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcholder,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;hold_set;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;unhold_set;<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;set_changed;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;hold_set_sorted;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unhold_set_sorted;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;combine_set();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch();<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.push_back(obj);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.push_back(obj);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;mark();<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">45</span>&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;gcholder()&nbsp;:&nbsp;&nbsp;set_changed(<span style="color: #0000FF; ">false</span>),&nbsp;&nbsp;hold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;,&nbsp;&nbsp;unhold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;{&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;};<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::combine_set(){<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!hold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(hold_set.begin(),hold_set.end());<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(unhold_set.begin(),unhold_set.end());<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set.empty())&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter1&nbsp;=&nbsp;hold_set.begin();<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter2&nbsp;=&nbsp;unhold_set.begin();<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(iter1&nbsp;!=&nbsp;hold_set.end()&nbsp;&amp;&amp;&nbsp;iter2&nbsp;!=&nbsp;unhold_set.end())&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*iter1&nbsp;==&nbsp;*iter2)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*iter1&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter2;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(*iter1&nbsp;&lt;&nbsp;*iter2);<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_gcobject&nbsp;*&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.erase(std::remove(hold_set.begin(),hold_set.end(),<span style="color: #0000FF; ">null</span>)&nbsp;,&nbsp;hold_set.end());<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.clear();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">78</span>&nbsp;}<br /><span style="color: #008080; ">79</span>&nbsp;<br /><span style="color: #008080; ">80</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::touch(){<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(set_changed)&nbsp;{<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combine_set();<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;std::for_each(hold_set.begin(),&nbsp;hold_set.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">86</span>&nbsp;}<br /><span style="color: #008080; ">87</span>&nbsp;<br /><span style="color: #008080; ">88</span>&nbsp;i_gcholder&nbsp;*&nbsp;i_gcholder::create(){<br /><span style="color: #008080; ">89</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;gcholder;<br /><span style="color: #008080; ">90</span>&nbsp;}</div></div><div></div><div></div><br /><br /><div></div><div></div><div></div><div>gcholder 理论上可以有多个实例，并相互挂接。（否则不需要继承至 i_gcobject ）这个设计可以用来模拟多级的堆栈。但实际上并不需要这么复杂。因为在大部分应用里，如果你的程序有一个周期性的主循环，就可以不在 gc 系统里模拟出一个多级的堆栈。我们只用在循环之外做 collect 即可。再堆栈调用的较深层次触发 collect 反而效果不佳，会导致许多临时 gc 对象无法回收。</div><div></div><div>最后来看一个玩具代码，用 stl 里的 mutliset 实现了一个简单的树接口。可能没有什么使用价值，但它演示了一个较复杂的对象相互引用的关系。并可以展示 gc 如何正确工作。</div><div></div><div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;test.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;&lt;cstdio&gt;<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">set</span>&gt;<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_tree&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*p)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_tree&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">18</span>&nbsp;};<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;tree&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_tree&nbsp;,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;tree&nbsp;*parent;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;std::multiset&lt;tree&nbsp;*&gt;&nbsp;children;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(tree&nbsp;*node)&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node-&gt;mark();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;mark();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::for_each(children.begin(),&nbsp;children.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unlink();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*parent);<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;tree()&nbsp;:&nbsp;parent(NULL)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;~tree()&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("release&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;};<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::unlink()&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;children.erase(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::link(i_tree&nbsp;*p){<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;unlink();<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree&nbsp;*&nbsp;cp&nbsp;=&nbsp;dynamic_cast&lt;tree&nbsp;*&gt;(p);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp-&gt;children.insert(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;cp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;<br /><span style="color: #008080; ">66</span>&nbsp;i_tree&nbsp;*i_tree::create(){<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;tree;<br /><span style="color: #008080; ">68</span>&nbsp;}<br /><span style="color: #008080; ">69</span>&nbsp;<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(){<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*root&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;root-&gt;grab();<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*node;<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;printf("collected\n");<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;node-&gt;link(NULL);<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;printf("finalize\n");<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;root-&gt;release();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div>我们在实现一个基于 gc 的对象时，可以先定义出需要的接口，让接口从 i_gcobject 继承。例如上例中的 i_tree 。</div><div></div><div>然后在实现这个接口时，可以虚继承 gcobject 。例如上例中的 tree 。</div><div></div><div>如果有需要，就重载 touch 方法，在 touch 方法中 mark 相关的 gcobject 。对于 tree 这个例子，就是调用父亲和孩子节点的 mark 。</div><div></div><div>对象依然可以写析构函数，相当于对象的 finalize 。在析构函数中，不要再释放和它相关的 gcobject ，那些留给 gc 系统去完成。（例如在 tree 里，就不要在 ~tree 中 delete children 容器中的变量，也不需要把自己从父亲节点上摘掉）</div><div></div><div>如果仅仅只是使用那些接口，则不需要再包含 gcobject.h ，因为 gcobject 的细节只供实现 i_gcobject 时使用。</div><img src ="http://www.cppblog.com/Khan/aggbug/216620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2019-08-01 10:57 <a href="http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>