锘??xml version="1.0" encoding="utf-8" standalone="yes"?>丰满少妇人妻久久久久久4,久久国产美女免费观看精品,久久久久久a亚洲欧洲aⅴhttp://www.shnenglu.com/Khan/璺極婕紝闀夸慨榪滐紝鎴戜滑涓嶈兘娌℃湁閽?/description>zh-cnTue, 06 May 2025 11:28:58 GMTTue, 06 May 2025 11:28:58 GMT60android 涓婄殑瀹剁敤鏈烘ā鎷熷櫒http://www.shnenglu.com/Khan/archive/2025/04/11/230434.htmlKhanKhanFri, 11 Apr 2025 07:01:00 GMThttp://www.shnenglu.com/Khan/archive/2025/04/11/230434.htmlhttp://www.shnenglu.com/Khan/comments/230434.htmlhttp://www.shnenglu.com/Khan/archive/2025/04/11/230434.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/230434.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/230434.html xxx.emu緋誨垪 https://github.com/Rakashazi/emu-ex-plus-alpha  涓涓煩 娌℃湁鍒嗚鯨鐜囨彁鍗囩壒鎬? 浣嗗吋瀹規ц繕涓嶉敊
 
 sony psp       ppsspp             https://github.com/hrydgard/ppsspp
 sony ps1       duckstation       https://github.com/stenzek/duckstation
 sony ps1       epsxe               https://www.epsxe.com
 sega DC        flycast               https://github.com/flyinghead/flycast
 sega saturn   Yaba Sanshiro2  https://www.yabasanshiro.com https://github.com/devmiyax/yabause  鍏煎鎬т竴鑸?/div>

Khan 2025-04-11 15:01 鍙戣〃璇勮
]]>
鍏充簬CppBlog棣栭〉CSS鏍峰紡涓㈠け闂瑙e喅鍔炴硶http://www.shnenglu.com/Khan/archive/2024/04/30/230338.htmlKhanKhanTue, 30 Apr 2024 08:54:00 GMThttp://www.shnenglu.com/Khan/archive/2024/04/30/230338.htmlhttp://www.shnenglu.com/Khan/comments/230338.htmlhttp://www.shnenglu.com/Khan/archive/2024/04/30/230338.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/230338.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/230338.html<link id="MainCss" type="text/css" rel="stylesheet" href="http://www.shnenglu.com/Skins/AnotherEon001/style.css" />
搴旇鏄煇浣嶅ぇ浣姞浜唄ttps璇佷功鍚庡繕璁板皢欏甸潰鍐呯殑css鏍峰紡閾炬帴鏀規垚https浜? 瀵艱嚧璇ヨ祫婧愯嫻忚鍣ㄦ嫤鎴?img src ="http://www.shnenglu.com/Khan/aggbug/230338.html" width = "1" height = "1" />

Khan 2024-04-30 16:54 鍙戣〃璇勮
]]>
C++ Atomichttp://www.shnenglu.com/Khan/archive/2022/10/14/229444.htmlKhanKhanFri, 14 Oct 2022 08:36:00 GMThttp://www.shnenglu.com/Khan/archive/2022/10/14/229444.htmlhttp://www.shnenglu.com/Khan/comments/229444.htmlhttp://www.shnenglu.com/Khan/archive/2022/10/14/229444.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/229444.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/229444.html闃呰鍏ㄦ枃

Khan 2022-10-14 16:36 鍙戣〃璇勮
]]>
Apple M1 arm cpu涓?鍚屾椂緙栬瘧arm64 涓?x86_64鐨勬柟娉?/title><link>http://www.shnenglu.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.shnenglu.com/Khan/archive/2022/10/14/229441.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/229441.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2022/10/14/229441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/229441.html</wfw:commentRss><trackback:ping>http://www.shnenglu.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> build && cd build<br /> ../configure CFLAGS=<span style="font-weight: bold;">'</span><span style="font-weight: bold;">-arch arm64 -arch x86_64</span><span style="font-weight: bold;">'</span> CXXFLAGS=<span style="font-weight: bold;">'</span><span style="font-weight: bold;">-arch arm64 -arch x86_64</span><span style="font-weight: bold;">'</span> LDFLAGS=<span style="font-weight: bold;">"</span><span style="font-weight: bold;">-arch arm64 -arch x86_64</span><span style="font-weight: bold;">"</span> --prefix /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 </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> build && cd build<br /> cmake -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> .. </div> </div> <div><br /> </div> <div><br /> </div> <div>qmake </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 /> --># 璁劇疆鍙橀噺<br /> QMAKE_APPLE_DEVICE_ARCHS = x86_64 arm64</div> </div> </div><img src ="http://www.shnenglu.com/Khan/aggbug/229441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan</a> 2022-10-14 11:33 <a href="http://www.shnenglu.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 鎵撳寘 絳懼悕 鍏瘉 鐩栫珷http://www.shnenglu.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.htmlKhanKhanFri, 07 Jan 2022 04:14:00 GMThttp://www.shnenglu.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.htmlhttp://www.shnenglu.com/Khan/comments/224697.htmlhttp://www.shnenglu.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/224697.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/224697.html闃呰鍏ㄦ枃

Khan 2022-01-07 12:14 鍙戣〃璇勮
]]>
QtCreator涓浣曚嬌鐢–onan鍖呯鐞嗗伐鍏?/title><link>http://www.shnenglu.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.shnenglu.com/Khan/archive/2021/10/19/217838.html</guid><wfw:comment>http://www.shnenglu.com/Khan/comments/217838.html</wfw:comment><comments>http://www.shnenglu.com/Khan/archive/2021/10/19/217838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Khan/comments/commentRss/217838.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Khan/services/trackbacks/217838.html</trackback:ping><description><![CDATA[     鎽樿: 瑕佺偣 Conan鏈韓鏄竴涓寘綆$悊宸ュ叿, 綾諱技Pyhon鐨刾ip, 鏈韓鐢≒ython緙栧啓 QT 6.0 寮濮嬪紩鍏onan鎻掍歡, 浠庝釜浜鴻瀵熸潵鐪? 浼間箮璇ユ彃浠朵粎浠呭紩鍏ヤ簡cmake鑴氭湰鏂囦歡 Conan鏈韓涓嶄緷璧朡tCreator, 鍙互闅忔剰浣跨敤, 鍏朵粬緙栬瘧鐜鍙互蹇界暐鎺夋湰鏂囩珷鎵鏈夊叧浜嶲T鐨勫唴瀹? 鍏朵粬涓嶅彉 涓 鍑嗗鐜, 瀹夎Conan 1.1 ...  <a href='http://www.shnenglu.com/Khan/archive/2021/10/19/217838.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/Khan/aggbug/217838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Khan/" target="_blank">Khan</a> 2021-10-19 16:09 <a href="http://www.shnenglu.com/Khan/archive/2021/10/19/217838.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>linux 鍜?windows涓?鑾峰彇涓繪満緗戝崱mac鍦板潃http://www.shnenglu.com/Khan/archive/2021/06/03/217702.htmlKhanKhanThu, 03 Jun 2021 09:42:00 GMThttp://www.shnenglu.com/Khan/archive/2021/06/03/217702.htmlhttp://www.shnenglu.com/Khan/comments/217702.htmlhttp://www.shnenglu.com/Khan/archive/2021/06/03/217702.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/217702.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/217702.html  1 #ifndef __EHTERNET_HPP__
  2 #define __EHTERNET_HPP__
  3 
  4 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
  5 #define MY_WIN32
  6 #elif defined(linux) || defined(__linux) || defined(__linux__)
  7 #define MY_LINUX
  8 #endif
  9 
 10 #include<string>
 11 
 12 #if defined(MY_WIN32)
 13 #include <winsock2.h>
 14 #include <iphlpapi.h>
 15 #endif
 16 
 17 #if defined(MY_LINUX)
 18 #include <sys/socket.h>
 19 //#include <linux/if.h>
 20 //#include <net/if.h>
 21 #include <sys/ioctl.h>
 22 #endif
 23 
 24 #if defined(MY_WIN32)
 25 std::string operstatusToStr(IF_OPER_STATUS status){
 26     switch(status){
 27     case IfOperStatusUp:
 28         return "up";
 29     case IfOperStatusDown:
 30         return "down";
 31     case IfOperStatusTesting:
 32         return "testing";
 33     case IfOperStatusUnknown:
 34         return "unknown";
 35     case IfOperStatusDormant:
 36         return "dormant";
 37     case IfOperStatusNotPresent:
 38         return "notPresent";
 39     case IfOperStatusLowerLayerDown:
 40         return "sLowerLayerDown";
 41     }
 42     return "unknown";
 43 }
 44 
 45 bool GetMacByGetAdaptersAddresses(std::string& macOUT, bool all = false) {
 46     bool ret = false;
 47 
 48     ULONG family = AF_UNSPEC;//榪斿洖鍖呮嫭 IPV4 鍜?nbsp;IPV6 鍦板潃
 49     ULONG flags = GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_INCLUDE_GATEWAYS;//鍖呮嫭 IPV4 錛孖PV6 闁橀亾鍣?/span>
 50     ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES) * 1;
 51     PIP_ADAPTER_ADDRESSES pAddresses = NULL;
 52 
 53     PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
 54 
 55     DWORD dwRetVal = 0;
 56     do {
 57         pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(outBufLen);
 58         if (pAddresses == NULL)
 59             return ret;
 60         dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
 61         if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
 62             free(pAddresses);
 63             pAddresses = NULL;
 64         } else {
 65             break;
 66         }
 67     } while (dwRetVal == ERROR_BUFFER_OVERFLOW);
 68 
 69     if (dwRetVal == NO_ERROR) {
 70         pCurrAddresses = pAddresses;
 71         while (pCurrAddresses) {
 72             if (pCurrAddresses->PhysicalAddressLength != 0) {
 73                 if(all || pCurrAddresses->OperStatus == IfOperStatusUp){
 74                     char type[8= {0};
 75                     switch (pCurrAddresses->IfType){ //緗戝崱綾誨瀷
 76                     case MIB_IF_TYPE_ETHERNET:
 77                         sprintf(type, "eth");
 78                         break;
 79                     case MIB_IF_TYPE_PPP:
 80                         sprintf(type, "ppp");
 81                         break;
 82                     case MIB_IF_TYPE_LOOPBACK:
 83                         sprintf(type, "loop");
 84                         break;
 85                     case MIB_IF_TYPE_SLIP:
 86                         sprintf(type, "atm");
 87                         break;
 88                     case IF_TYPE_IEEE80211:
 89                         sprintf(type, "wifi");
 90                         break;
 91                     }
 92 
 93                     char acMAC[32];
 94                     sprintf(acMAC, "%02X%02X%02X%02X%02X%02X", (unsigned char)(pCurrAddresses->PhysicalAddress[0]), (unsigned char)(pCurrAddresses->PhysicalAddress[1]),
 95                             (unsigned char)(pCurrAddresses->PhysicalAddress[2]), (unsigned char)(pCurrAddresses->PhysicalAddress[3]),
 96                             (unsigned char)(pCurrAddresses->PhysicalAddress[4]), (unsigned char)(pCurrAddresses->PhysicalAddress[5]));
 97                     macOUT = macOUT + acMAC + '\n';
 98                 }
 99             }
100 
101 
102             pCurrAddresses = pCurrAddresses->Next;
103         }
104         ret = true;
105     } else {
106 
107     }
108 
109     if (pAddresses) free(pAddresses);
110     return ret;
111 }
112 #endif
113 
114 #if defined(MY_LINUX)
115 bool GetMacByGetAdaptersAddresses(std::string& macOUT, bool all = false){
116     int sock, if_count, i;
117     struct ifconf ifc;
118     struct ifreq ifr[10];
119     char mac[32];
120 
121     memset(&ifc, 0sizeof(struct ifconf));
122     sock = socket(AF_INET, SOCK_DGRAM, 0);
123 
124     ifc.ifc_len = 10 * sizeof(struct ifreq);
125     ifc.ifc_buf = (char *)ifr;
126 
127     //鑾峰彇鎵鏈夌綉鍗′俊鎭?/span>
128     ioctl(sock, SIOCGIFCONF, (char *)&ifc);
129     if_count = ifc.ifc_len / (sizeof(struct ifreq));
130     for (i = 0; i < if_count; i++) {
131         if (ioctl(sock, SIOCGIFHWADDR, &ifr[i]) == 0) {
132             if(all || (ifr[i].ifr_flags & IFF_RUNNING) ){
133                 memcpy(mac, ifr[i].ifr_hwaddr.sa_data, 6);
134                 sprintf(mac, "%02X%02X%02X%02X%02X%02X", (unsigned char)(mac[0]), (unsigned char)(mac[1]), (unsigned char)(mac[2]),
135                         (unsigned char)(mac[3]), (unsigned char)(mac[4]), (unsigned char)(mac[5]));
136                 macOUT = macOUT + mac + '\n';
137 //                printf("eth: %s, mac: %02x:%02x:%02x:%02x:%02x:%02x\n", ifr[i].ifr_name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
138             }
139         }
140     }
141     return true;
142 }
143 #endif
144 
145 #endif
146 
147 
璋冪敤鏂瑰紡

    std::string macs;
    GetMacByGetAdaptersAddresses(macs, true);
    qDebug() << TIMESTAMP << macs.c_str();





Khan 2021-06-03 17:42 鍙戣〃璇勮
]]>
ChaCha20 鍔犲瘑 綆楁硶 c++11瀹炵幇http://www.shnenglu.com/Khan/archive/2021/06/03/217701.htmlKhanKhanThu, 03 Jun 2021 09:38:00 GMThttp://www.shnenglu.com/Khan/archive/2021/06/03/217701.htmlhttp://www.shnenglu.com/Khan/comments/217701.htmlhttp://www.shnenglu.com/Khan/archive/2021/06/03/217701.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/217701.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/217701.html  1 #ifndef CHACHA20_H  2 #define ...  闃呰鍏ㄦ枃

Khan 2021-06-03 17:38 鍙戣〃璇勮
]]>
SHA256 綆楁硶c++11 瀹炵幇http://www.shnenglu.com/Khan/archive/2021/06/03/217700.htmlKhanKhanThu, 03 Jun 2021 09:31:00 GMThttp://www.shnenglu.com/Khan/archive/2021/06/03/217700.htmlhttp://www.shnenglu.com/Khan/comments/217700.htmlhttp://www.shnenglu.com/Khan/archive/2021/06/03/217700.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/217700.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/217700.html闃呰鍏ㄦ枃

Khan 2021-06-03 17:31 鍙戣〃璇勮
]]>
鍦?C++ 涓疄鐜頒竴涓交閲忕殑鏍囪娓呴櫎 gc 緋葷粺(杞澆)http://www.shnenglu.com/Khan/archive/2019/08/01/GC_System_for_Cpp.htmlKhanKhanThu, 01 Aug 2019 02:57:00 GMThttp://www.shnenglu.com/Khan/archive/2019/08/01/GC_System_for_Cpp.htmlhttp://www.shnenglu.com/Khan/comments/216620.htmlhttp://www.shnenglu.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback0http://www.shnenglu.com/Khan/comments/commentRss/216620.htmlhttp://www.shnenglu.com/Khan/services/trackbacks/216620.html# 鍦?C++ 涓疄鐜頒竴涓交閲忕殑鏍囪娓呴櫎 gc 緋葷粺
[寮曠敤](https://blog.codingnow.com/2010/02/cpp_gc.html)
鏈榪戞兂鎶?engine 鍋氫竴涓畝鍗?C++ 灝佽錛岀粨鍚?QT 浣跨敤銆俥ngine 鏈韓鏄敤綰?C 瀹炵幇鐨勶紝澶ч儴鍒嗗簲鐢ㄥ熀浜?lua 寮鍙戙傚瀵硅薄鐢熷懡鏈熺鐞嗕篃渚濊禆 lua 鐨?gc 緋葷粺銆傚叧浜庤繖閮ㄥ垎鐨勮璁★紝鍙互鍙傝冩垜浠ュ墠鍐欑殑涓綃?涓?lua 灝佽 C 瀵硅薄鐨勭敓瀛樻湡綆$悊闂 銆?br />
褰撴垜浠妸涓棿灞傛惉鍒?C++ 涓椂錛岄亣鍒扮殑闂涔嬩竴灝辨槸錛孋++ 娌℃湁鍘熺敓鐨?gc 鏀寔銆傛垜涔熸浘緇忓啓榪囦竴涓?gc 搴撱備絾鍦ㄧ壒瀹氬簲鐢ㄤ笅榪樹笉澶熺畝媧併傝繖鍑犲ぉ榪囧勾浼戞伅錛屼粩緇嗚冭檻浜嗕竴涓嬬浉鍏崇殑闇姹傦紝灝濊瘯瀹炵幇浜嗕竴涓洿綆鍗曠殑 gc 妗嗘灦銆備笉鍒?200 琛屼唬鐮佸惂錛屾垜鐩存帴鍒楀湪榪欑瘒 blog 閲屻?br />
榪欎簺灝氭槸涓浜涚帺鍏蜂唬鐮侊紝鎴戣姳浜嗕竴澶╂椂闂存潵鍐欍傛湁璁稿鑰冭檻涓嶅懆鐨勫湴鏂癸紝浠ュ強涓嶅畬鏁寸殑鍔熻兘銆備絾鍙互闃愭槑涓浜涘熀鏈濊礬銆?br />
棣栧厛鎴戦渶瑕佷竴涓猔鏍囪娓呴櫎`鐨?`gc緋葷粺`錛岀敤鏉ヨВ鍐砢寮曠敤璁版暟`涓嶅鏄撹В鍐崇殑`寰幆寮曠敤`闂銆傚畠鐨勫疄鐜頒笉鎯蟲瘮`寮曠敤璁版暟`澶嶆潅澶錛屽茍鏈夌浉鍚岀敋鑷蟲洿楂樼殑鎬ц兘銆?br />
鎴戜笉鎯充嬌鐢ㄥ鏉傜殑 template 鎶鏈紝鍒╃敤澶鐨勮娉曠硸璁╀嬌鐢ㄧ湅璧鋒潵綆鍗曘傚鏋滈渶瑕佽榪欎簺 C++ 浠g爜鐪嬭搗鏉ユ洿鐜頒唬錛屾洿鏈?#8220;鍝佸懗”錛屾垜鎯充篃涓嶆槸寰堥毦鐨勪簨鎯呫?br />
鎺ュ彛鍜屽疄鐜板笇鏈涘敖閲忓垎紱伙紝瀵圭敤鐨勪漢灝戞毚闇茬粏鑺傘備絾涓嶆嫎娉ヤ簬鏁欐潯錛屽己姹傚仛鎴愮被浼?COM 閭f牱鐨勯氱敤 ABI 銆傝繕鏄敖閲忓埄鐢?C++ 璇█鏈韓鎻愪緵鐨勬満鍒訛紝涓嶆互鐢ㄣ?br />
浣跨敤灝介噺綆鍗曪紝涓嶈璁╀嬌鐢ㄤ漢鍛樻湁澶ぇ璐熸媴銆?br />
鍔熻兘婊¤凍鏈浣庨渶姹傚嵆鍙備唬鐮佸鏄撻槄璇伙紝浣跨敤浜哄憳鍙互寰堝揩鐞嗚В鍘熺悊錛屼笉鑷充簬璇敤銆備篃鏂逛究鏃ュ悗鎵╁睍浠ラ傚簲鏂扮殑闇姹傘?br />
浠g爜濡備笅錛?/div>
 1 /* 
 2  * filename: i_gcobject.h 
 3  * Copyright (c) 2010 ,
 4  * Cloud Wu . All rights reserved. 
 5  * 
 6  * http://www.codingnow.com 
 7  * 
 8  * Use, modification and distribution are subject to the "New BSD License" 
 9  * as listed at . 
10  */ 
11   
12 #ifndef interfacce_gcobject_h 
13 #define interfacce_gcobject_h 
14 
15 #define interface struct 
16 
17 interface i_gcobject { 
18     virtual ~i_gcobject() {} 
19 
20     virtual void touch() {} 
21 
22     virtual void mark() = 0 ; 
23     virtual void grab() = 0 ; 
24     virtual void release() = 0 ; 
25 
26     static void collect(); 
27 }; 
28 #endif

鎵鏈夋敮鎸?`gc綆$悊鐨勬帴鍙閮界戶鎵胯嚦 `i_gcobject` 錛屾彁渚涗笁涓柟娉?
* mark 鍙互鎶婅繖涓璞℃墦涓婃爣璁幫紝琚爣璁扮殑瀵硅薄灝嗕笉浼氳 collect 鍥炴敹銆?/div>
* grab 灝嗗璞℃寕鎺ュ埌涓涓縐板懠涓?root 鐨勭壒孌?gcobject 涓娿?/div>
* release 灝嗗璞′粠 root 涓婂彇鎺夈?br />
鍙︽彁渚?touch 鐨勬ā鏉挎柟娉曚緵 mark 鍥炶皟錛岀敤鏉ユ爣璁板悓涓瀵硅薄涓殑涓嶅悓閮ㄥ垎銆?/div>
mark 鏂規硶涓鑸湪 touch 鏂規硶涓嬌鐢紝鍙﹀錛宑ollect 鏂規硶灝嗕富鍔ㄨ皟鐢?root 鐨?mark 銆?br />
 1 /*  filename: i_gcholder.h
 2  *  Copyright (c) 2010 ,
 3  *      Cloud Wu . All rights reserved.
 4  *
 5  *      http://www.codingnow.com
 6  *
 7  *  Use, modification and distribution are subject to the "New BSD License"
 8  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 9  */
10 
11 #ifndef interfacce_gcholder_h
12 #define interfacce_gcholder_h
13 
14 #include "i_gcobject.h"
15 
16 interface i_gcholder : virtual i_gcobject {
17   virtual void hold(i_gcobject *) = 0;
18   virtual void unhold(i_gcobject *) = 0;
19   
20   static i_gcholder * create();
21 };
22 #endif
`i_gcholder` 涓?root 鐨勬帴鍙o紝鎻愪緵 `hold` 鍜?`unhold` 鏂規硶鏉ユ寕鎺ラ渶瑕佹寔涔呬繚鐣欑殑 gcobject 銆?br />
 1 /*  filename: i_gcobject.h
 2  *  Copyright (c) 2010 ,
 3  *      Cloud Wu . All rights reserved.
 4  *
 5  *      http://www.codingnow.com
 6  *
 7  *  Use, modification and distribution are subject to the "New BSD License"
 8  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 9  */
10 
11 #ifndef interfacce_gcobject_h
12 #define interfacce_gcobject_h
13 #define interface struct
14 
15 interface i_gcobject {
16 
17   virtual ~i_gcobject() {}
18 
19   virtual void touch() {}
20 
21   virtual void mark() = 0 ;
22   virtual void grab() = 0 ;
23   virtual void release() = 0 ;
24 
25   static void collect();
26 };
27 #endif
 1 /*  filename: gcobject.h
 2  *  Copyright (c) 2010 ,
 3  *      Cloud Wu . All rights reserved.
 4  *
 5  *      http://www.codingnow.com
 6  *
 7  *  Use, modification and distribution are subject to the "New BSD License"
 8  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 9  */
10 
11 #ifndef gc_object_h
12 #define gc_object_h
13 
14 #include "i_gcobject.h"
15 
16 class gcobject : virtual i_gcobject {
17   bool marked;
18 
19 public:
20   gcobject();
21 
22   virtual void mark();
23   virtual void grab();
24   virtual void release();
25 
26   struct f_unmarked;
27 
28 };
29 #endif
30 ```
31 
32 ```c++
33 /*  filename: gcobject.cpp 
34  *  Copyright (c) 2010 ,
35  *      Cloud Wu . All rights reserved.
36  *
37  *      http://www.codingnow.com
38  *
39  *  Use, modification and distribution are subject to the "New BSD License"
40  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
41  */
42 
43 #include "gcobject.h"
44 #include "i_gcholder.h"
45 #include <vector>
46 #include <algorithm>
47 
48 static bool gc_trigger;
49 static std::vector<gcobject *> gc_pool;
50 static i_gcholder * gc_root = i_gcholder::create();
51 
52 
53 struct gcobject::f_unmarked {
54   bool operator() (gcobject * value) {
55     bool unmarked = value->marked != gc_trigger;
56     if (unmarked) {
57       delete value;
58     }
59     return unmarked;
60   }
61 };
62 
63 gcobject::gcobject() : marked(!gc_trigger) {
64   gc_pool.push_back(this);
65 }
66 
67 void gcobject::mark() {
68   if (marked != gc_trigger) {
69     marked = gc_trigger;
70     touch();
71   }
72 }
73 
74 void gcobject::grab(){
75   gc_root->hold(this);
76 }
77 
78 void gcobject::release(){
79   gc_root->unhold(this);
80 }
81 
82 void i_gcobject::collect() {
83   gc_root->mark();
84   gc_pool.erase(remove_if(gc_pool.begin(), gc_pool.end() , gcobject::f_unmarked()), gc_pool.end());
85   gc_trigger = !gc_trigger;
86 }
gcobject 涓哄叿浣撶殑 gc 瀹炵幇錛屽疄鐜頒簡 `mark` 銆乣grab`銆乣release` 鍜?`collect` 鏂規硶銆?/div>
`mark` 閲囩敤鐨勭洿鎺ュ悜涓 bool 鍙橀噺璁劇疆鏍囪銆傝繖涓爣璁板埄鐢ㄤ簡 `trigger` 榪欎釜涔掍箵寮鍏籌紝姣忔 `collect` 閮戒細鍒囨崲鐘舵併?/div>
`grab` 鍜?`release` 鍙互鎶婂璞℃寕鎺ュ埌 root 涓婏紝鎴栦粠涓婂彇鎺夈?/div>
`collect` 浼氫富鍔ㄤ粠 root 寮濮?`mark` 錛屽茍閲婃斁閭d簺娌℃湁 `mark` 鐨勫璞°?br />
 1 /*  filename: gcholder.cpp
 2  *  Copyright (c) 2010 ,
 3  *      Cloud Wu . All rights reserved.
 4  *
 5  *      http://www.codingnow.com
 6  *
 7  *  Use, modification and distribution are subject to the "New BSD License"
 8  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 9  */
10 
11 #include "i_gcholder.h"
12 #include "gcobject.h"
13 #include <vector>
14 #include <algorithm>
15 #include <cassert>
16 
17 class gcholder : public virtual i_gcholder, virtual gcobject {
18   std::vector<i_gcobject *> hold_set;
19   std::vector<i_gcobject *> unhold_set;
20 
21   bool set_changed;
22   bool hold_set_sorted;
23   bool unhold_set_sorted;
24 
25   void combine_set();
26   virtual void touch();
27 
28   virtual void hold(i_gcobject *obj) {
29     hold_set.push_back(obj);
30     hold_set_sorted = false;
31     set_changed = true;
32   }
33 
34   virtual void unhold(i_gcobject *obj) {
35     unhold_set.push_back(obj);
36     unhold_set_sorted = false;
37     set_changed = true;
38   }
39 
40   struct f_mark {
41     void operator() (i_gcobject *obj) {
42       obj->mark();
43     }
44   };
45 
46 public:
47 
48   gcholder() :  set_changed(false),  hold_set_sorted(true) ,  unhold_set_sorted(true) {  }
49 
50 };
51 
52 void gcholder::combine_set(){
53   if (!hold_set_sorted) {
54     std::sort(hold_set.begin(),hold_set.end());
55     hold_set_sorted = true;
56   }
57   if (!unhold_set_sorted) {
58     std::sort(unhold_set.begin(),unhold_set.end());
59     unhold_set_sorted = true;
60   }
61   if (!unhold_set.empty()) {
62     std::vector<i_gcobject *>::iterator iter1 = hold_set.begin();
63     std::vector<i_gcobject *>::iterator iter2 = unhold_set.begin();
64     while (iter1 != hold_set.end() && iter2 != unhold_set.end()) {
65       if (*iter1 == *iter2) {
66         *iter1 = NULL;
67         ++iter1;
68         ++iter2;
69       } else {
70         assert(*iter1 < *iter2);
71         ++iter1;
72       }
73     }
74     i_gcobject * null = NULL;
75     hold_set.erase(std::remove(hold_set.begin(),hold_set.end(),null) , hold_set.end());
76     unhold_set.clear();
77   }
78 }
79 
80 void gcholder::touch(){
81   if (set_changed) {
82     combine_set();
83     set_changed = false;
84   }
85   std::for_each(hold_set.begin(), hold_set.end(), f_mark());
86 }
87 
88 i_gcholder * i_gcholder::create(){
89   return new gcholder;
90 }


gcholder 鐞嗚涓婂彲浠ユ湁澶氫釜瀹炰緥錛屽茍鐩鎬簰鎸傛帴銆傦紙鍚﹀垯涓嶉渶瑕佺戶鎵胯嚦 i_gcobject 錛夎繖涓璁″彲浠ョ敤鏉ユā鎷熷綰х殑鍫嗘爤銆備絾瀹為檯涓婂茍涓嶉渶瑕佽繖涔堝鏉傘傚洜涓哄湪澶ч儴鍒嗗簲鐢ㄩ噷錛屽鏋滀綘鐨勭▼搴忔湁涓涓懆鏈熸х殑涓誨驚鐜紝灝卞彲浠ヤ笉鍦?gc 緋葷粺閲屾ā鎷熷嚭涓涓綰х殑鍫嗘爤銆傛垜浠彧鐢ㄥ湪寰幆涔嬪鍋?collect 鍗沖彲銆傚啀鍫嗘爤璋冪敤鐨勮緝娣卞眰嬈¤Е鍙?collect 鍙嶈屾晥鏋滀笉浣籌紝浼氬鑷磋澶氫復鏃?gc 瀵硅薄鏃犳硶鍥炴敹銆?/div>
鏈鍚庢潵鐪嬩竴涓帺鍏蜂唬鐮侊紝鐢?stl 閲岀殑 mutliset 瀹炵幇浜嗕竴涓畝鍗曠殑鏍戞帴鍙c傚彲鑳芥病鏈変粈涔堜嬌鐢ㄤ環鍊鹼紝浣嗗畠婕旂ず浜嗕竴涓緝澶嶆潅鐨勫璞$浉浜掑紩鐢ㄧ殑鍏崇郴銆傚茍鍙互灞曠ず gc 濡備綍姝g‘宸ヤ綔銆?/div>

 1 /*  filename: test.cpp
 2  *  Copyright (c) 2010 ,
 3  *      Cloud Wu . All rights reserved.
 4  *
 5  *      http://www.codingnow.com
 6  *
 7  *  Use, modification and distribution are subject to the "New BSD License"
 8  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 9  */
10 #include "gcobject.h"
11 #include <cstdio>
12 #include <set>
13 #include <algorithm>
14 
15 interface i_tree : virtual i_gcobject {
16   virtual void link(i_tree *p) = 0;
17   static i_tree * create();
18 };
19 
20 class tree : public virtual i_tree , virtual gcobject {
21   tree *parent;
22   std::multiset<tree *> children;
23   struct f_mark {
24     void operator() (tree *node) {
25       node->mark();
26     }
27   };
28 
29   virtual void touch() {
30     if (parent)
31       parent->mark();
32     std::for_each(children.begin(), children.end(), f_mark());
33   }
34 
35   void unlink();
36   virtual void link(i_tree *parent);
37 
38 public:
39   tree() : parent(NULL) {
40     printf("create node %p\n",this);
41   }
42 
43   ~tree() {
44     printf("release node %p\n",this);
45   }
46 
47 };
48 
49 
50 void tree::unlink() {
51   if (parent) {
52     parent->children.erase(this);
53     parent = NULL;
54   }
55 }
56 
57 void tree::link(i_tree *p){
58   unlink();
59   if (p) {
60     tree * cp = dynamic_cast<tree *>(p);
61     cp->children.insert(this);
62     parent = cp;
63   }
64 }
65 
66 i_tree *i_tree::create(){
67   return new tree;
68 }
69 
70 int main(){
71   i_tree *root = i_tree::create();
72   root->grab();
73   i_tree *node;
74   node = i_tree::create();
75   node->link(root);
76   node = i_tree::create();
77   node->link(root);
78   i_gcobject::collect();
79   printf("collected\n");
80   node->link(NULL);
81   i_gcobject::collect();
82   printf("finalize\n");
83   root->release();
84   i_gcobject::collect();
85   return 0;
86 }
鎴戜滑鍦ㄥ疄鐜頒竴涓熀浜?gc 鐨勫璞℃椂錛屽彲浠ュ厛瀹氫箟鍑洪渶瑕佺殑鎺ュ彛錛岃鎺ュ彛浠?i_gcobject 緇ф壙銆備緥濡備笂渚嬩腑鐨?i_tree 銆?/div>
鐒跺悗鍦ㄥ疄鐜拌繖涓帴鍙f椂錛屽彲浠ヨ櫄緇ф壙 gcobject 銆備緥濡備笂渚嬩腑鐨?tree 銆?/div>
濡傛灉鏈夐渶瑕侊紝灝遍噸杞?touch 鏂規硶錛屽湪 touch 鏂規硶涓?mark 鐩稿叧鐨?gcobject 銆傚浜?tree 榪欎釜渚嬪瓙錛屽氨鏄皟鐢ㄧ埗浜插拰瀛╁瓙鑺傜偣鐨?mark 銆?/div>
瀵硅薄渚濈劧鍙互鍐欐瀽鏋勫嚱鏁幫紝鐩稿綋浜庡璞$殑 finalize 銆傚湪鏋愭瀯鍑芥暟涓紝涓嶈鍐嶉噴鏀懼拰瀹冪浉鍏崇殑 gcobject 錛岄偅浜涚暀緇?gc 緋葷粺鍘誨畬鎴愩傦紙渚嬪鍦?tree 閲岋紝灝變笉瑕佸湪 ~tree 涓?delete children 瀹瑰櫒涓殑鍙橀噺錛屼篃涓嶉渶瑕佹妸鑷繁浠庣埗浜茶妭鐐逛笂鎽樻帀錛?/div>
濡傛灉浠呬粎鍙槸浣跨敤閭d簺鎺ュ彛錛屽垯涓嶉渶瑕佸啀鍖呭惈 gcobject.h 錛屽洜涓?gcobject 鐨勭粏鑺傚彧渚涘疄鐜?i_gcobject 鏃朵嬌鐢ㄣ?/div>

Khan 2019-08-01 10:57 鍙戣〃璇勮
]]> 久久久久久亚洲AV无码专区| 久久久久亚洲精品男人的天堂| 久久精品一本到99热免费| 亚洲国产精品无码久久久久久曰 | 久久亚洲中文字幕精品有坂深雪| 久久亚洲中文字幕精品一区| 国产精品久久久久久福利漫画 | 日本精品久久久久久久久免费| 久久夜色精品国产噜噜亚洲a| 少妇久久久久久被弄高潮| 91久久精品国产免费直播| 久久久久国产精品人妻| 亚洲国产精品久久久久网站| 久久黄视频| 欧美亚洲另类久久综合| 区久久AAA片69亚洲| 国产精品美女久久久久AV福利| 久久亚洲精品成人无码网站 | 精品国产乱码久久久久软件| 久久国产精品99久久久久久老狼| 久久综合九色综合网站| 久久国产视频99电影| 久久av无码专区亚洲av桃花岛| 色悠久久久久久久综合网| 久久久久免费精品国产| 久久精品欧美日韩精品| 99久久免费国产精品特黄| 青青热久久国产久精品 | 久久婷婷五月综合成人D啪| A级毛片无码久久精品免费| 国产婷婷成人久久Av免费高清| 久久久久精品国产亚洲AV无码| 亚洲伊人久久综合中文成人网| 嫩草影院久久99| 伊人色综合久久| 国内精品久久久久久久coent| 97久久久久人妻精品专区| 久久99国产乱子伦精品免费| www久久久天天com| 久久成人国产精品二三区| 久久99热精品|