锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 璇ラ敊璇富瑕佹槸鐢變簬闈欐佸簱鍦╒C6緙栬瘧鑰屼富紼嬪簭鍦╒C2005緙栬瘧錛屽ぇ瀹剁敤鐨凜RT涓嶅悓銆傝В鍐沖姙娉曪紝浠g爜涓鍔?/p>
#ifdef __cplusplus 姝ら敊璇殑浜х敓鏍規簮錛?br>
鍦╒C6鐨剆tdio.h涔嬩腑鏈夊涓嬪畾涔?/p>
_CRTIMP extern FILE _iob[]; stdin銆乻tdout銆乻tderr鏄氳繃鏌iob鏁扮粍寰楀埌鐨勩傛墍浠ワ紝VC6緙栬瘧鐨勭▼搴忋侀潤鎬佸簱鍙鐢ㄥ埌浜唒rintf銆乻canf涔嬬被鐨勫嚱鏁幫紝閮借閾炬帴_iob鏁扮粍銆?/p>
鑰屽湪vc2005涓紝stdio.h涓彉鎴愪簡 _CRTIMP FILE * __cdecl __iob_func(void); _iob鏁扮粍涓嶅啀鏄樉寮忕殑鏆撮湶鍑烘潵浜嗭紝闇瑕佽皟鐢╛_iob_func()鍑芥暟鑾峰緱銆傛墍浠c6鐨勯潤鎬佸簱閾炬帴VC2005鐨凜榪愯搴撳氨浼氭壘涓嶅埌_iob鏁扮粍. Let's start with the reason why I
wrote this article. One day, a colleague asked me to help him debug
a problem he had. So I was watching him stepping in
his code, when I noticed the following line:
He did this, because he wanted to know the error code, if the previous
function failed. He was adding this line every time he wanted to know the error
code. I advised him to remove all those lines and use the @ERR pseudoregister in
his watch window. He didn't know what it was and asking around in the office, a
lot of other people didn't. So I came up with this article for people who have never
heard of pseudoregisters. A pseudoregister is not an actual hardware
register, but is displayed as though it were a hardware register. With a
pseudoregister, you can see and use certain values (error codes,
thread information block...) in the debugger. Let's have a look at the @ERR pseudoregister. Fire up your debugger with your
favourite home-written application. Put a breakpoint in your code so that the
debugger will break execution. Open the watch window if it isn't already (do
this by right clicking on some empty toolbar space, and select "Watch" from this
list). Add @ERR in this watch window. You should see 0 in the Value column. Now
step through your code, and watch this value. It will always show the
If you want to test this, but your code doesn't
have any errors, I advise to put some in (but don't forget to remove them
afterwards). You can insert something like this: If you step over this line, you'll see that the @ERR value changed to 2. Go to Tools->Error Lookup to see
what this error value means ("The system cannot find the file specified" if you
were wondering). Lazy bums like me, and smart lads / lasses like you can change
the @ERR pseudoregister to @ERR,hr . Doing this will change the value of the
pseudoregister to the error string. Now you even don't have to lookup the error.
I leave the @ERR,hr in the watch window all the time. Pseudoregisters can also
be used in conditional expressions. To try this out, put following lines after
the Put a breakpoint on the Just for the very curious (and
otherwise totally irrelevant to this article) : what does @ERR do? How does it
get the error number? As it turns out, @ERR does exactly the same thing as
So The @ERR pseudoregister is not the only one that exists. Another important pseudoregister
is @TIB. This is the thread information block for the current thread and is
extremely helpful in multi-threaded debugging. If you place a breakpoint in a
function that is called by multiple threads, the debugger will break execution
every time no matter which thread passes the breakpoint. Even if you're stepping
through your code, the debugger can jump to the breakpoint if another thread
called the function. To solve this, you'll need to do the following. If
execution breaks in the thread you want, add @TIB in the watch window. You will
see some value like "0x7ffa6000" or "2147115008" in regular display. Go to the
breakpoint menu (Alt-F9) and select the breakpoint. You can now add the
This doesn't work in Windows 98 though. For Windows 98,
you'll need to look at the Intel CPU FS register, which is unique for each
thread. You can use the expression
Pseudoregister Description @ERR Last error value; the same value returned by the @TIB Thread information block for the current thread; necessary because the debugger doesn't handle the "FS:0" format @CLK Undocumented clock register; usable only in the Watch window @EAX, @EBX, @ECX, @EDX, @ESI, @EDI, @EIP, @ESP, @EBP, @EFL Intel CPU registers @CS, @DS, @ES, @SS, @FS, @GS Intel CPU segment registers @ST0, @ST1, @ST2, @ST3, @ST4, @ST5, @ST6, @ST7 Intel CPU floating-point registers 鍦?#8220;鏌ユ壘”銆?#8220;鍦ㄦ枃浠朵腑鏌ユ壘”鎴?#8220;鍦ㄦ枃浠朵腑鏇挎崲”瀵硅瘽妗嗕腑錛屽彲浣跨敤涓嬪垪姝e垯琛ㄨ揪寮忔潵鏀硅繘鍜屾墿灞曟悳绱€?/p>
鍙嬌鐢ㄤ笅鍒楄〃杈懼紡鍖歸厤鎼滅儲瀛楃涓蹭腑鐨勫瓧絎︽垨鏁板瓧錛?/p>
鍦?#8220;鏇挎崲”琛ㄨ揪寮忎腑錛孿0 鎻掑叆鏁翠釜鍖歸厤鐨勬枃鏈?/p>
涓嬭〃鍒楀嚭鎸夋爣鍑?Unicode 瀛楃灞炴ц繘琛屽尮閰嶇殑璇硶銆備袱涓瓧姣嶇殑緙╁啓璇嶄笌 Unicode 瀛楃灞炴ф暟鎹簱涓墍鍒楃殑涓鏍楓傚彲灝嗚繖浜涙寚瀹氫負瀛楃闆嗙殑涓閮ㄥ垎銆備緥濡傦紝琛ㄨ揪寮?[:Nd:Nl:No] 鍖歸厤浠諱綍縐嶇被鐨勬暟瀛椼?/p>
闄ゆ爣鍑?Unicode 瀛楃灞炴у錛岃繕鍙互鎸囧畾涓嬪垪闄勫姞灞炴с傚彲灝嗚繖浜涘睘鎬ф寚瀹氫負瀛楃闆嗙殑涓閮ㄥ垎銆?/p>
銆銆C++鐨勮緟鍔╁伐鍏風箒澶氾紝鎴戜滑鍒嗛棬鍒被鐨勪負澶у浣滀粙緇嶏細 銆銆4.1 鏂囨。綾?/p>
銆銆(1) Doxygen 銆銆鍙傝冪珯鐐癸細http://www.doxygen.org/ 銆銆Doxygen鏄竴縐嶉傚悎C椋庢牸璇█錛堝C++銆丆銆両DL銆丣ava鐢氳嚦鍖呮嫭C#鍜孭HP錛夌殑銆?br>寮鏀炬簮鐮佺殑銆佸熀浜庡懡浠よ鐨勬枃妗d駭鐢熷櫒銆?/p>
銆銆(2) C++2HTML 銆銆鍙傝冪珯鐐癸細http://www.bedaux.net/cpp2html/ 銆銆鎶奀++浠g爜鍙樻垚璇硶楂樹寒鐨凥TML 銆銆(3) CodeColorizer 銆銆鍙傝冪珯鐐癸細http://www.chami.com/colorizer/ 銆銆瀹冭兘鎶婂ソ鍑犵璇█鐨勬簮浠g爜鐫鑹蹭負HTML 銆銆(4) Doc-O-Matic 銆銆鍙傝冪珯鐐癸細http://www.doc-o-matic.com/ 銆銆Doc-O_Matic涓轟綘鐨凜/C++錛孋++.net錛孌elphi/Pascal, VB.NET錛孋#鍜孞ava紼嬪簭 銆銆(5) DocVizor 銆銆鍙傝冪珯鐐癸細http://www.ucancode.net/Products/DocBuilder/Features.htm 銆銆DocVizor婊¤凍浜嗛潰鍚戝璞¤蔣浠跺紑鍙戣呯殑鍩烘湰瑕佹眰鈥斺斿畠璁╂垜浠兘澶熺湅鍒癈++宸ョ▼ 銆銆(6) SourcePublisher C++ 銆銆鍙傝冪珯鐐癸細http://www.scitools.com/sourcepublisher_c.html 銆銆緇欐簮浠g爜浜х敓鎻愪緵蹇熺洿瑙傜殑HTML鎶ヨ〃錛屽寘鎷唬鐮侊紝綾誨眰嬈$粨鏋勶紝璋冪敤鍜岃璋?br>鐢ㄦ爲錛屽寘鍚拰琚寘鍚爲銆傛敮鎸佸縐嶆搷浣滅郴緇熴?/p>
銆銆(7) Understand 銆銆鍙傝冪珯鐐癸細http://www.scitools.com/ucpp.html 銆銆鍒嗘瀽浠諱綍瑙勬ā鐨凜鎴栬匔++宸ョ▼錛屽府鍔╂垜浠洿濂界殑鐞嗚В浠ュ強緙栧啓鏂囨。銆?/p>
銆銆4.2 浠g爜綾?/p>
銆銆(1) CC-Rider 銆銆鍙傝冪珯鐐癸細http://www.cc-rider.com/ 銆銆CC-Rider鏄敤浜嶤/C++紼嬪簭寮哄ぇ鐨勪唬鐮佸彲瑙嗗寲宸ュ叿錛岄氳繃浜や簰寮忔祻瑙堛佺紪杈戝強鑷?br>鍔ㄦ枃浠舵潵淇冭繘紼嬪簭鐨勭淮鎸佸拰鍙戝睍銆?/p>
銆銆(2) CodeInspect 銆銆鍙傝冪珯鐐癸細http://www.yokasoft.com/ 銆銆涓縐嶆柊鐨凜/C++浠g爜鍒嗘瀽宸ュ叿銆傚畠媯鏌ユ垜浠殑婧愪唬鐮佹壘鍑洪潪鏍囧噯鐨勶紝鍙兘鐨勶紝浠?br>鍙婃櫘閫氱殑閿欒浠g爜銆?/p>
銆銆(3) CodeWizard 銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/ 銆銆鍏堣繘鐨凜/C++婧愪唬鐮佸垎鏋愬伐鍏鳳紝浣跨敤瓚呰繃500涓紪鐮佽鑼冭嚜鍔ㄥ寲鍦版爣鏄庡嵄闄╃殑錛?br>浣嗘槸緙栬瘧鍣ㄤ笉鑳芥鏌ュ埌鐨勪唬鐮佺粨鏋勩?/p>
銆銆(4) C++ Validation Test Suites 銆銆鍙傝冪珯鐐癸細http://www.plumhall.com/suites.html 銆銆涓緇勭敤浜庢祴璇曠紪璇戝櫒鍜屽簱瀵逛簬鏍囧噯鍚誨悎紼嬪害鐨勪唬鐮佸簱銆?/p>
銆銆(5) CppRefactory 銆銆鍙傝冪珯鐐癸細http://cpptool.sourceforge.net/ 銆銆CPPRefactory鏄竴涓嬌寰楀紑鍙戣呰兘澶熼噸鏋勪粬浠殑C++浠g爜鐨勭▼搴忋傜洰鐨勬槸浣垮緱C 銆銆(6) Lzz 銆銆鍙傝冪珯鐐癸細http://www.lazycplusplus.com/ 銆銆Lzz鏄竴涓嚜鍔ㄥ寲璁稿C++緙栫▼涓殑浣撳姏媧葷殑宸ュ叿銆傚畠鑳藉鑺傜渷鎴戜滑璁稿浜嬩歡騫?br>涓斾嬌寰楃紪鐮佹洿鍔犳湁涔愯叮銆傜粰鍑轟竴緋誨垪鐨勫0鏄庯紝Lzz浼氱粰鎴戜滑鍒涘緩澶存枃浠跺拰婧愭枃浠躲?/p>
銆銆(7) QA C++ Generation 2000 銆銆鍙傝冪珯鐐癸細http://www.programmingresearch.com/solutions/qacpp.htm 銆銆瀹冨叧娉ㄩ潰鍚戝璞$殑C++婧愪唬鐮侊紝瀵規湁鍏充簬璁捐錛屾晥鐜囷紝鍙潬鎬э紝鍙淮鎶ゆх殑閮ㄥ垎 銆銆(8) s-mail project - Java to C++DOL 銆銆鍙傝冪珯鐐癸細http://sadlocha.strefa.pl/s-mail/ja2dol.html 銆銆鎶奐ava婧愪唬鐮佺炕璇戜負鐩稿簲鐨凜++婧愪唬鐮佺殑鍛戒護琛屽伐鍏楓?/p>
銆銆(9) SNIP from Cleanscape Software International 銆銆鍙傝冪珯鐐癸細http://www.cleanscape.net/stdprod/snip/index.html 銆銆涓涓~騫崇紪鐮佸拰璁捐涔嬮棿娌熷鐨勬槗浜庝嬌鐢ㄧ殑C++寮鍙戝伐鍏鳳紝鑺傜渷澶ч噺緙栬緫鍜岃皟璇?br>鐨勪簨浠訛紝瀹冭繕浣垮緱寮鍙戣呰兘澶熸寚瀹氳璁℃ā寮忎綔涓哄璞℃ā鍨嬶紝鑷姩浠庡璞℃ā鍨嬩腑浜х敓 銆銆(10) SourceStyler C++ 銆銆鍙傝冪珯鐐癸細http://www.ochresoftware.com/ 銆銆瀵笴/C++婧愪唬鐮佹彁渚涘畬鏁寸殑鏍煎紡鍖栧拰鎺掔増鎺у埗鐨勫伐鍏楓傛彁渚涘浜?5涓殑鏍煎紡鍖栭?br>欏逛互鍙婂畬鍏ㄦ敮鎸丄NSI C++銆?/p>
銆銆4.3 緙栬瘧綾?/p>
銆銆(1) Compilercache 銆銆鍙傝冪珯鐐癸細http://www.erikyyy.de/compilercache/ 銆銆Compilercache鏄竴涓浣犵殑C鍜孋++緙栬瘧鍣ㄧ殑灝佽鑴氭湰銆傛瘡嬈℃垜浠繘琛岀紪璇戯紝灝?br>瑁呰剼鏈紝鎶婄紪璇戠殑緇撴灉鏀懼叆緙撳瓨錛屼竴鏃︾紪璇戠浉鍚岀殑涓滆タ錛岀粨鏋滃皢浠庣紦瀛樹腑鍙栧嚭鑰屼笉 銆銆(2) Ccache 銆銆鍙傝冪珯鐐癸細http://ccache.samba.org/ 銆銆Ccache鏄竴涓紪璇戝櫒緙撳瓨銆傚畠浣跨敤璧鋒潵灝卞儚C/C++緙栬瘧鍣ㄧ殑緙撳瓨棰勫鐞嗗櫒錛岀紪璇?br>閫熷害閫氬父鑳芥彁楂樻櫘閫氱紪璇戣繃紼嬬殑5~10鍊嶃?/p>
銆銆(3) Cmm (C++ with MultiMethods) 銆銆鍙傝冪珯鐐癸細http://www.op59.net/cmm/cmm-0.28/users.html 銆銆榪欐槸涓縐岰++璇█鐨勬墿灞曘傝鍏mm婧愪唬鐮佽緭鍑篊++鐨勬簮浠g爜錛屽姛鑳芥槸瀵笴++璇█ 銆銆(4) The Frost Project 銆銆鍙傝冪珯鐐癸細http://frost.flewid.de/ 銆銆Forst浣垮緱浣犺兘澶熷湪C++紼嬪簭涓儚鍘熺敓鐨凜++鐗規т竴鏍蜂嬌鐢╩ultimethod浠ュ強铏氬嚱 銆銆4.4 嫻嬭瘯鍜岃皟璇曠被 銆銆(1) CPPUnit 銆銆CppUnit 鏄釜鍩轟簬 LGPL 鐨勫紑婧愰」鐩紝鏈鍒濈増鏈Щ妞嶈嚜 JUnit錛屾槸涓涓潪甯鎬紭 銆銆(2) C++Test 銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/ 銆銆C++ Test鏄竴涓崟鍏冩祴璇曞伐鍏鳳紝瀹冭嚜鍔ㄥ寲浜咰鍜孋++綾伙紝鍑芥暟鎴栬呯粍浠剁殑嫻嬭瘯銆?/p>
銆銆鍙傝冪珯鐐癸細http://www.iplbath.com/products/tools/pt400.shtml 銆銆璁捐鐨勭洰鐨勬槸涓轟簡婊¤凍鍦ㄥ悎鐞嗙殑緇忔祹寮閿涓嬩嬌鐢ㄨ繖涓伐鍏峰彲浠ヨ寮鍙戝伐紼嬪笀寮 銆銆(4) Purify 銆銆鍙傝冪珯鐐癸細http://www-900.ibm.com/cn/software/rational/products/purif 銆銆IBM Rational PurifyPlus鏄竴濂楀畬鏁寸殑榪愯鏃跺垎鏋愬伐鍏鳳紝鏃ㄥ湪鎻愰珮搴旂敤紼嬪簭鐨?br>鍙潬鎬у拰鎬ц兘銆侾urifyPlus灝嗗唴瀛橀敊璇拰娉勬紡媯嫻嬨佸簲鐢ㄧ▼搴忔ц兘鎻忚堪銆佷唬鐮佽鐩?br>鍒嗘瀽絳夊姛鑳界粍鍚堝湪涓涓崟涓銆佸畬鏁寸殑宸ュ叿鍖呬腑銆?/p>
銆銆(5) BoundsChecker 銆銆BoundsChecker鏄竴涓狢++榪愯鏃墮敊璇嫻嬪拰璋冭瘯宸ュ叿銆傚畠閫氳繃鍦╒isual Studi 銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/ 銆銆涓涓嚜鍔ㄥ寲鐨勮繍琛屾椂紼嬪簭嫻嬭瘯宸ュ叿錛屾鏌ラ毦浠ュ療瑙夌殑閿欒,濡傚唴瀛樿鐩栵紝鍐呭瓨娉?br>婕忥紝鍐呭瓨鍒嗛厤閿欒錛屽彉閲忓垵濮嬪寲閿欒錛屽彉閲忓畾涔夊啿紿侊紝鎸囬拡閿欒錛屽簱閿欒錛岄昏緫閿?br>璇拰綆楁硶閿欒絳夈?/p>
銆銆(7) GlowCode 銆銆鍙傝冪珯鐐癸細http://www.glowcode.com/ 銆銆GlowCode鍖呮嫭鍐呭瓨娉勬紡媯鏌ワ紝code profiler錛屽嚱鏁拌皟鐢ㄨ窡韙瓑鍔熻兘銆傜粰C++寮 銆銆(8) Stack Spy 銆銆鍙傝冪珯鐐癸細http://www.imperioustech.com/ 銆銆瀹冭兘鎹曟崏stack corruption, stack over run, stack overflow絳夋湁鍏蟲爤鐨勯敊 ------------------------------------------------------------------------ 5錛屽簱 銆銆鍦–++涓紝搴撶殑鍦頒綅鏄潪甯擱珮鐨勩侰++涔嬬埗 Bjarne Stroustrup鍏堢敓澶氭琛ㄧず浜?br>璁捐搴撴潵鎵╁厖鍔熻兘瑕佸ソ榪囪璁℃洿澶氱殑璇硶鐨勮█璁恒傜幇瀹炰腑錛孋++鐨勫簱闂ㄧ被綣佸錛岃В鍐?br>鐨勯棶棰樹篃鏄瀬鍏跺箍娉涳紝搴撲粠杞婚噺綰у埌閲嶉噺綰х殑閮芥湁銆備笉灝戦兘鏄浜虹溂鐣屽ぇ寮錛屼害鎴?br>鏄湜鑰岀敓鍙圭殑鎬濈淮鏉頒綔銆傜敱浜庡簱鐨勬暟閲忛潪甯稿簽澶э紝鑰屼笖闄愪簬絎旇呮按騫籌紝鍏朵腑寰堝騫?br>涓嶄簡瑙c傛墍浠ユ枃涓墍鎻愮殑涓浜涘簱閮芥槸姣旇緝钁楀悕鐨勫ぇ鍨嬪簱銆?/p>
銆銆5.1 鏍囧噯搴?/p>
銆銆鏍囧噯搴撲腑鎻愪緵浜咰++紼嬪簭鐨勫熀鏈鏂姐傝櫧鐒禖++鏍囧噯搴撻殢鐫C++鏍囧噯鎶樿吘浜嗚澶氬勾 銆銆(1) Dinkumware C++ Library 銆銆鍙傝冪珯鐐癸細http://www.dinkumware.com/ 銆銆P.J. Plauger緙栧啓鐨勯珮鍝佽川鐨勬爣鍑嗗簱銆侾.J. Plauger鍗氬+鏄疍r. Dobb's紼嬪簭璁?br>璁℃澃鍑哄鐨勮幏寰楄呫傚叾緙栧啓鐨勫簱闀挎湡琚玀icrosoft閲囩敤錛屽茍涓旀渶榪態orland涔熷彇寰椾簡 銆銆(2) RogueWave Standard C++ Library 銆銆鍙傝冪珯鐐癸細http://www.roguewave.com/ 銆銆榪欎釜搴撳湪Borland C++ Builder鐨勬棭鏈熺増鏈腑鏇劇粡琚噰鐢紝鍚庢潵琚叾浠栫殑搴撶粰鏇?br>鎹簡銆傜瑪鑰呬笉鎺ㄨ崘浣跨敤銆?/p>
銆銆(3) SGI STL 銆銆鍙傝冪珯鐐癸細http://www.roguewave.com/ 銆銆SGI鍏徃鐨凜++鏍囧噯妯$増搴撱?/p>
銆銆(4) STLport 銆銆鍙傝冪珯鐐癸細http://www.stlport.org/ 銆銆SGI STL搴撶殑璺ㄥ鉤鍙板彲縐繪鐗堟湰銆?/p>
銆銆5.2 “鍑?#8221;鏍囧噯搴?nbsp;- Boost 銆銆鍙傝冪珯鐐癸細http://www.boost.org/ 銆銆鍥藉唴闀滃儚錛?a class=contentlink target=_blank>http://www.c-view.org/tech/lib/boost/index.htm 銆銆Boost搴撴槸涓涓粡榪囧崈閿ょ櫨鐐箋佸彲縐繪銆佹彁渚涙簮浠g爜鐨凜++搴擄紝浣滀負鏍囧噯搴撶殑鍚?br>澶囷紝鏄疌++鏍囧噯鍖栬繘紼嬬殑鍙戝姩鏈轟箣涓銆?nbsp;Boost搴撶敱C++鏍囧噯濮斿憳浼氬簱宸ヤ綔緇勬垚鍛樺彂璧?br>錛屽湪C++紺懼尯涓獎鍝嶇敋澶э紝鍏舵垚鍛樺凡榪?000浜恒?nbsp;Boost搴撲負鎴戜滑甯︽潵浜嗘渶鏂般佹渶閰楓?br>鏈瀹炵敤鐨勬妧鏈紝鏄笉鎶樹笉鎵g殑“鍑?#8221;鏍囧噯搴撱?/p>
銆銆Boost涓瘮杈冩湁鍚嶆皵鐨勬湁榪欎箞鍑犱釜搴擄細 銆銆Regex 銆銆姝e垯琛ㄨ揪寮忓簱 銆銆Spirit 銆銆LL parser framework錛岀敤C++浠g爜鐩存帴琛ㄨ揪EBNF 銆銆Graph 銆銆鍥劇粍浠跺拰綆楁硶 銆銆Lambda 銆銆鍦ㄨ皟鐢ㄧ殑鍦版柟瀹氫箟鐭皬鍖垮悕鐨勫嚱鏁板璞★紝寰堝疄鐢ㄧ殑functional鍔熻兘 銆銆concept check 銆銆媯鏌ユ硾鍨嬬紪紼嬩腑鐨刢oncept 銆銆鐢ㄦā鏉垮疄鐜扮殑鍏冪紪紼嬫鏋?/p>
銆銆鍙Щ妞嶇殑C++澶氱嚎紼嬪簱 銆銆鎶奀++綾誨拰鍑芥暟鏄犲皠鍒癙ython涔嬩腑 銆銆Pool 銆銆鍐呭瓨姹犵鐞?/p>
銆銆5涓櫤鑳芥寚閽堬紝瀛︿範鏅鴻兘鎸囬拡蹇呰錛屼竴浠戒笉閿欑殑鍙傝冩槸鏉ヨ嚜CUJ鐨勬枃绔狅細 銆銆Smart Pointers in Boost錛屽摝錛岃繖綃囨枃绔犲彲浠ユ煡鍒幫紝CUJ鏄彁渚涘湪綰挎祻瑙堢殑銆?br>涓枃鐗堣絎旇呭湪銆奃r. Dobb's Journal杞歡鐮斿彂鏉傚織銆嬬7杈戜笂鐨勮瘧鏂囥?/p>
銆銆Boost鎬諱綋鏉ヨ鏄疄鐢ㄤ環鍊煎緢楂橈紝璐ㄩ噺寰堥珮鐨勫簱銆傚茍涓旂敱浜庡叾瀵硅法騫沖彴鐨勫己璋冿紝 銆銆5.3 GUI 銆銆鍦ㄤ紬澶欳++鐨勫簱涓紝GUI閮ㄥ垎鐨勫簱綆楁槸姣旇緝綣佽崳錛屼篃姣旇緝寮曚漢娉ㄧ洰鐨勩傚湪瀹為檯寮 銆銆(1) MFC 銆銆澶у悕榧庨紟鐨勫井杞熀紜綾誨簱錛圡icrosoft Foundation Class錛夈傚ぇ鍑″榪嘨C++鐨?br>浜洪兘搴旇鐭ラ亾榪欎釜搴撱傝櫧鐒朵粠鎶鏈搴﹁錛孧FC鏄笉澶ф紓浜殑錛屼絾鏄畠鏋勫緩浜嶹indo 銆銆(2) QT 銆銆鍙傝冪綉绔欙細http://www.trolltech.com/ 銆銆Qt鏄疶rolltech鍏徃鐨勪竴涓騫沖彴鐨凜++鍥懼艦鐢ㄦ埛鐣岄潰搴旂敤紼嬪簭妗嗘灦銆傚畠鎻愪緵緇?br>搴旂敤紼嬪簭寮鍙戣呭緩绔嬭壓鏈駭鐨勫浘褰㈢敤鎴風晫闈㈡墍闇鐨勬墍鐢ㄥ姛鑳姐俀t鏄畬鍏ㄩ潰鍚戝璞$殑 銆銆(3) WxWindows 銆銆鍙傝冪綉绔欙細http://www.wxwindows.org/ 銆銆璺ㄥ鉤鍙扮殑GUI搴撱傚洜涓哄叾綾誨眰嬈℃瀬鍍廙FC錛屾墍浠ユ湁鏂囩珷浠嬬粛浠嶮FC鍒癢xWindows鐨?br>浠g爜縐繪浠ュ疄鐜拌法騫沖彴鐨勫姛鑳姐傞氳繃澶氬勾鐨勫紑鍙戜篃鏄竴涓棩瓚嬪畬鍠勭殑GUI搴擄紝鏀寔鍚?br>鏍蜂笉寮變簬鍓嶉潰涓や釜搴撱傚茍涓旀槸瀹屽叏寮鏀炬簮浠g爜鐨勩傛柊榪戠殑C++ Builder X鐨凣UI璁捐 銆銆(4) Fox 銆銆鍙傝冪綉绔欙細http://www.fox-toolkit.org/ 銆銆寮鏀炬簮浠g爜鐨凣UI搴撱備綔鑰呬粠鑷繁浜茶韓鐨勫紑鍙戠粡楠屼腑寰楀嚭浜嗕竴涓悊鎯崇殑GUI搴撳簲 銆銆鍩轟簬ATL鐨勪竴涓簱銆傚洜涓轟嬌鐢ㄤ簡澶ч噺ATL鐨勮交閲忕駭鎵嬫硶錛屾ā鏉跨瓑鎶鏈紝鍦ㄤ唬鐮佸昂 銆銆(6) GTK 銆銆鍙傝冪綉绔欙細http://gtkmm.sourceforge.net/ 銆銆GTK鏄竴涓ぇ鍚嶉紟榧庣殑C鐨勫紑婧怗UI搴撱傚湪Linux涓栫晫涓湁Gnome榪欐牱鐨勬潃鎵嬪簲鐢ㄣ?br>鑰孏TK灝辨槸榪欎釜搴撶殑C++灝佽鐗堟湰銆?/p>
銆銆5.4 緗戠粶閫氫俊 銆銆(1) ACE 銆銆鍙傝冪綉绔欙細http://www.cs.wustl.edu/~schmidt/ACE.html 銆銆C++搴撶殑浠h〃錛岃秴閲嶉噺綰х殑緗戠粶閫氫俊寮鍙戞鏋躲侫CE鑷傞厤閫氫俊鐜錛圓daptive 銆銆(2) StreamModule 銆銆鍙傝冪綉绔欙細http://www.omnifarious.org/StrMod/ 銆銆璁捐鐢ㄤ簬綆鍖栫紪鍐欏垎甯冨紡紼嬪簭鐨勫簱銆傚皾璇曠潃浣垮緱緙栧啓澶勭悊寮傛琛屼負鐨勭▼搴忔洿瀹?br>鏄擄紝鑰屼笉鏄敤鍚屾鐨勫澹沖寘璧峰紓姝ョ殑鏈川銆?/p>
銆銆(3) SimpleSocket 銆銆鍙傝冪綉绔欙細http://home.hetnet.nl/~lcbokkers/simsock.htm 銆銆榪欎釜綾誨簱璁╃紪鍐欏熀浜巗ocket鐨勫鎴?鏈嶅姟鍣ㄧ▼搴忔洿鍔犲鏄撱?/p>
銆銆(4) A Stream Socket API for C++ 銆銆鍙傝冪綉绔欙細http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h 銆銆鍙堜竴涓Socket鐨勫皝瑁呭簱銆?/p>
銆銆5.5 XML 銆銆(1) Xerces 銆銆鍙傝冪綉绔欙細http://xml.apache.org/xerces-c/ 銆銆Xerces-C++ 鏄竴涓潪甯稿仴澹殑XML瑙f瀽鍣紝瀹冩彁渚涗簡楠岃瘉錛屼互鍙奡AX鍜孌OM API 銆銆(2) XMLBooster 銆銆鍙傝冪綉绔欙細http://www.xmlbooster.com/ 銆銆榪欎釜搴撻氳繃浜х敓鐗瑰埗鐨刾arser鐨勫姙娉曟瀬澶х殑鎻愰珮浜哫ML瑙f瀽鐨勯熷害錛屽茍涓旇兘澶熶駭 銆銆(3) Pull Parser 銆銆鍙傝冪綉绔欙細http://www.extreme.indiana.edu/xgws/xsoap/xpp/ 銆銆榪欎釜搴撻噰鐢╬ull鏂規硶鐨刾arser銆傚湪姣忎釜SAX鐨刾arser搴曞眰閮芥湁涓涓猵ull鐨刾arse 銆銆鍙傝冪綉绔欙細http://xml.apache.org/xalan-c/ 銆銆Xalan鏄竴涓敤浜庢妸XML鏂囨。杞崲涓篐TML錛岀函鏂囨湰鎴栬呭叾浠朮ML綾誨瀷鏂囨。鐨刋SLT澶?br>鐞嗗櫒銆?/p>
銆銆(5) CMarkup 銆銆鍙傝冪綉绔欙細http://www.firstobject.com/xml.htm 銆銆榪欐槸涓縐嶄嬌鐢‥DOM鐨刋ML瑙f瀽鍣ㄣ傚湪寰堝鎬濊礬涓婇潰闈炲父鐏墊椿瀹炵敤銆傚煎緱澶у鍦― 銆銆(6) libxml++ 銆銆http://libxmlplusplus.sourceforge.net/ 銆銆libxml++鏄钁楀悕鐨刲ibxml XML瑙f瀽鍣ㄧ殑C++灝佽鐗堟湰 銆銆5.6 縐戝璁$畻 銆銆(1) Blitz++ 銆銆鍙傝冪綉绔欙細http://www.oonumerics.org/blitz/ 銆銆Blitz++ 鏄竴涓珮鏁堢巼鐨勬暟鍊艱綆楀嚱鏁板簱錛屽畠鐨勮璁$洰鐨勬槸甯屾湜寤虹珛涓濂楁棦鍏?br>鍍廋++ 涓鏍鋒柟渚匡紝鍚屾椂鍙堟瘮Fortran閫熷害鏇村揩鐨勬暟鍊艱綆楃幆澧冦傞氬父錛岀敤C++鎵鍐欏嚭 銆銆(2) POOMA 銆銆鍙傝冪綉绔欙細http://www.codesourcery.com/pooma/pooma 銆銆POOMA鏄竴涓厤璐圭殑楂樻ц兘鐨凜++搴擄紝鐢ㄤ簬澶勭悊騫惰寮忕瀛﹁綆椼侾OOMA鐨勯潰鍚戝 銆銆(3) MTL 銆銆鍙傝冪綉绔欙細http://www.osl.iu.edu/research/mtl/ 銆銆Matrix Template Library(MTL)鏄竴涓珮鎬ц兘鐨勬硾鍨嬬粍浠跺簱錛屾彁渚涗簡鍚勭鏍煎紡 銆銆(4) CGAL 銆銆鍙傝冪綉绔欙細http://www.cgal.org/ 銆銆Computational Geometry Algorithms Library鐨勭洰鐨勬槸鎶婂湪璁$畻鍑犱綍鏂歸潰鐨勫ぇ 銆銆5.7 娓告垙寮鍙?/p>
銆銆(1) Audio/Video 3D C++ Programming Library 銆銆鍙傝冪綉绔欙細http://www.galacticasoftware.com/products/av/ 銆銆AV3D鏄竴涓法騫沖彴錛岄珮鎬ц兘鐨凜++搴撱備富瑕佺殑鐗規ф槸鎻愪緵3D鍥懼艦錛屽0鏁堟敮鎸侊紙S 銆銆(2) KlayGE 銆銆鍙傝冪綉绔欙細http://home.g365.net/enginedev/ 銆銆鍥藉唴娓告垙寮鍙戦珮鎵嬭嚜宸辯敤C++寮鍙戠殑娓告垙寮曟搸銆侹layGE鏄竴涓紑鏀炬簮浠g爜銆佽法騫?br>鍙扮殑娓告垙寮曟搸錛屽茍浣跨敤Python浣滆剼鏈璦銆侹layGE鍦↙GPL鍗忚涓嬪彂琛屻傛劅璋㈤練鏁忔晱 銆銆(3) OGRE 銆銆鍙傝冪綉绔欙細http://www.ogre3d.org/ 銆銆OGRE錛堥潰鍚戝璞$殑鍥懼艦娓叉煋寮曟搸錛夋槸鐢–++寮鍙戠殑錛屼嬌鐢ㄧ伒媧葷殑闈㈠悜瀵硅薄3D寮曟搸 銆銆5.8 綰跨▼ 銆銆(1) C++ Threads 銆銆鍙傝冪綉绔欙細http://threads.sourceforge.net/ 銆銆榪欎釜搴撶殑鐩爣鏄粰紼嬪簭鍛樻彁渚涙槗浜庝嬌鐢ㄧ殑綾伙紝榪欎簺綾昏緇ф壙浠ユ彁渚涘湪Linux鐜 銆銆(2) ZThreads 銆銆鍙傝冪綉绔欙細http://zthread.sourceforge.net/ 銆銆涓涓厛榪涚殑闈㈠悜瀵硅薄錛岃法騫沖彴鐨凜++綰跨▼鍜屽悓姝ュ簱銆?/p>
銆銆5.9 搴忓垪鍖?/p>
銆銆(1) s11n 銆銆鍙傝冪綉绔欙細http://s11n.net/ 銆銆涓涓熀浜嶴TL鐨凜++搴擄紝鐢ㄤ簬搴忓垪鍖朠OD錛孲TL瀹瑰櫒浠ュ強鐢ㄦ埛瀹氫箟鐨勭被鍨嬨?/p>
銆銆(2) Simple XML Persistence Library 銆銆鍙傝冪綉绔欙細http://sxp.sourceforge.net/ 銆銆榪欐槸涓涓妸瀵硅薄搴忓垪鍖栦負XML鐨勮交閲忕駭鐨凜++搴撱?/p>
銆銆5.10 瀛楃涓?/p>
銆銆(1) C++ Str Library 銆銆鍙傝冪綉绔欙細http://www.utilitycode.com/str/ 銆銆鎿嶄綔瀛楃涓插拰瀛楃鐨勫簱錛屾敮鎸乄indows鍜屾敮鎸乬cc鐨勫縐嶅鉤鍙般傛彁渚涢珮搴︿紭鍖栫殑 銆銆(2) Common Text Transformation Library 銆銆鍙傝冪綉绔欙細http://cttl.sourceforge.net/ 銆銆榪欐槸涓涓В鏋愬拰淇敼STL瀛楃涓茬殑搴撱侰TTL substring綾誨彲浠ョ敤鏉ユ瘮杈冿紝鎻掑叆錛?br>鏇挎崲浠ュ強鐢‥BNF鐨勮娉曡繘琛岃В鏋愩?/p>
銆銆(3) GRETA 銆銆鍙傝冪綉绔欙細http://research.microsoft.com/projects/greta/ 銆銆榪欐槸鐢卞井杞爺絀墮櫌鐨勭爺絀朵漢鍛樺紑鍙戠殑澶勭悊姝e垯琛ㄨ揪寮忕殑搴撱傚湪灝忓瀷鍖歸厤鐨勬儏鍐?br>涓嬫湁闈炲父浼樼鐨勮〃鐜般?/p>
銆銆5.11 緇煎悎 銆銆(1) P::Classes 銆銆鍙傝冪綉绔欙細http://pclasses.com/ 銆銆涓涓珮搴﹀彲縐繪鐨凜++搴旂敤紼嬪簭妗嗘灦銆傚綋鍓嶅叧娉ㄧ被鍨嬪拰綰跨▼瀹夊叏鐨剆ignal/slot 銆銆(2) ACDK - Artefaktur Component Development Kit 銆銆鍙傝冪綉绔欙細http://acdk.sourceforge.net/ 銆銆榪欐槸涓涓鉤鍙版棤鍏崇殑C++緇勪歡妗嗘灦錛岀被浼間簬Java鎴栬?NET涓殑妗嗘灦錛堝弽灝勬満鍒訛紝 銆銆(3) dlib C++ library 銆銆鍙傝冪綉绔欙細http://www.cis.ohio-state.edu/~kingd/dlib/ 銆銆鍚勭鍚勬牱鐨勭被鐨勪竴涓患鍚堛傚ぇ鏁存暟錛孲ocket錛岀嚎紼嬶紝GUI錛屽鍣ㄧ被,浠ュ強嫻忚鐩?br>褰曠殑API絳夌瓑銆?/p>
銆銆(4) Chilkat C++ Libraries 銆銆鍙傝冪綉绔欙細http://www.chilkatsoft.com/cpp_libraries.asp 銆銆榪欐槸鎻愪緵zip錛宔-mail錛岀紪鐮侊紝S/MIME錛孹ML絳夋柟闈㈢殑搴撱?/p>
銆銆(5) C++ Portable Types Library (PTypes) 銆銆鍙傝冪綉绔欙細http://www.melikyan.com/ptypes/ 銆銆榪欐槸STL鐨勬瘮杈冪畝鍗曠殑鏇夸唬鍝侊紝浠ュ強鍙Щ妞嶇殑澶氱嚎紼嬪拰緗戠粶搴撱?/p>
銆銆(6) LFC 銆銆鍙傝冪綉绔欙細http://lfc.sourceforge.net/ 銆銆鍝︼紝榪欏張鏄竴涓皾璇曟彁渚涗竴鍒囩殑C++搴?/p>
銆銆5.12 鍏朵粬搴?/p>
銆銆(1) Loki 銆銆鍙傝冪綉绔欙細http://www.moderncppdesign.com/ 銆銆鍝︼紝浣犲彲鑳芥姳鎬ㄦ垜鏃╄鍜孊oost涓璧蜂粙緇嶅畠錛屼竴涓疄楠屾ц川鐨勫簱銆備綔鑰呭湪loki涓?br>鎶奀++妯℃澘鐨勫姛鑳藉彂鎸ュ埌浜嗘瀬鑷淬傚茍涓斿皾璇曟妸綾諱技璁捐妯″紡榪欐牱鎬濇兂灞傞潰鐨勪笢瑗塊氳繃 銆銆(2) ATL 銆銆ATL(Active Template Library) 銆銆鏄竴緇勫皬宸с侀珮鏁堛佺伒媧葷殑綾伙紝榪欎簺綾諱負鍒涘緩鍙簰鎿嶄綔鐨凜OM緇勪歡鎻愪緵浜嗗熀鏈殑 銆銆(3) FC++: The Functional C++ Library 銆銆榪欎釜搴撴彁渚涗簡涓浜涘嚱鏁板紡璇█涓墠鏈夌殑瑕佺礌銆傚睘浜庣敤搴撴潵鎵╁厖璇█鐨勪竴涓唬琛?br>浣溿傚鏋滄兂瑕佸湪OOP涔嬪瀵繪壘鍙︿竴鍒嗙殑涔愯叮錛屽彲浠ュ幓鐪嬬湅鍑芥暟寮忕▼搴忚璁$殑涓栫晫銆傚ぇ 銆銆(4) FACT! 銆銆鍙傝冪綉绔欙細http://www.kfa-juelich.de/zam/FACT/start/index.html 銆銆鍙﹀涓涓疄鐜板嚱鏁板紡璇█鐗規х殑搴?/p>
銆銆(5) Crypto++ 銆銆鎻愪緵澶勭悊瀵嗙爜錛屾秷鎭獙璇侊紝鍗曞悜hash錛屽叕鍖欏姞瀵嗙郴緇熺瓑鍔熻兘鐨勫厤璐瑰簱銆?/p>
銆銆榪樻湁寰堝闈炲父嬋鍔ㄤ漢蹇冩垨鑰呮槸鏋佸叾瀹炵敤鐨凜++搴擄紝闄愪簬鎴戜滑鐨勬按騫充互鍙婃枃绔犵殑綃?br>騫呬笉鑳藉寘鎷繘鏉ャ傚湪瀵逛簬榪欎簺宸茬粡鍖呭惈榪戞潵鐨勫簱鐨勪粙緇嶄腑錛岀敱浜庡茍涓嶆槸姣忎竴涓垜浠?br>閮戒嬌鐢ㄨ繃錛屾墍浠ラ毦鍏嶆湁鍋忛涔嬪錛岃璇昏呰璋呫?/p>
extern "C"
#endif
FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])
閫氳繃閲嶆柊瀹氫箟
FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};
灝辨妸vc6闇瑕佺敤鍒扮殑_iob鏁扮粍鎼炲嚭鏉ヤ簡
]]>
Collapseint test = GetLastError();
What is a pseudoregister anyway?
GetLastError() number for the current thread. So if something goes wrong in your
code, this value will change.
CollapseFILE *fp = fopen("c:\\a_file_that_does_not_exist.txt", "r");
Conditional Expressions
fopen:
Collapseif (fp)
{
fclose(fp);
}if (fp) line. Go to Edit->Breakpoints (or
press Alt-F9). Select the breakpoint you just inserted and press the "Condition"
button. Here, you can enter the @ERR==2 condition. Now start the debugger. The
debugger will break on this breakpoint if fopen() failed because it couldn't find
the file. If the file does exist, the debugger won't break, even if it
encountered another error (say error 4: could not open the file). Try this out by
running the code (not stepping) after creating, and deleting the
"a_file_that_does_not_exist.txt" file on c:\.GetLastError() does. These functions have a whopping 3 lines of assembly code:
Collapsemov eax,fs:[00000018h]
mov eax,dword ptr [eax+34h]
ret@ERR grabs the DWORD at
offset 0x34 in the thread environment block pointed to by fs:[18h].The @TIB pseudoregister
@TIB==0x7ffa6000 condition filter. Doing this, the debugger will only break
execution for this thread. All other threads using the same function will not
result in a break.@FS==value Complete list of pseudoregisters
GetLastError() API function
]]>
鏈寮濮嬩嬌鐢?pragma section(SECNAME,long,read)鐨勬柟娉曪紝鎶婃煇涓嚱鏁板姞鍏ュ埌鏌愪釜section涓紝鍥犱負CRT鏄寜鐓ection鐨勫瓧姣嶅簭鎵ц鐨勶紝榪欎釜鏂規硶
鍦╡xe涓墽琛岀殑寰堝ソ錛屼笉騫哥殑鏄垜浠槸鍦ㄤ竴涓猟ll涓紝榪欎釜鏂規硶涓嶅鏁堛?br>
鏈鍚庢煡鐪媘sdn錛屽啓閬擄細濡傛灉鏄嬌鐢╠ll錛屼嬌鐢?strong>#pragma init_seg
#pragma init_seg(compiler)
_CRTIMP2 MemoryManager MemMnger;
榪欐牱錛屽垵濮嬪寲宸ヤ綔鍦ㄧ紪璇戝櫒鍒濆鍖栫殑鏃跺欏氨鎵ц浜嗭紝榪炴柇鐐歸兘鏂笉鍒頒簡
]]>
娉ㄦ剰???鍦ㄥ皢涓嬪垪浠諱綍琛ㄨ揪寮忕敤浣滄悳绱㈡潯浠剁殑涓閮ㄥ垎涔嬪墠錛屽繀欏誨湪“鏌ユ壘”銆?#8220;鍦ㄦ枃浠朵腑鏌ユ壘”鍜?#8220;鍦ㄦ枃浠朵腑鏇挎崲”瀵硅瘽妗嗕腑閫夋嫨“浣跨敤”澶嶉夋銆?/blockquote>
琛ㄨ揪寮?/th>
璇硶
璇存槑
浠諱竴瀛楃
.
鍖歸厤闄ゆ崲琛岀澶栫殑浠諱綍涓涓瓧絎︺?/td>
鏈澶?0 欏規垨鏇村
*
鍖歸厤鍓嶉潰琛ㄨ揪寮忕殑 0 涓垨鏇村鎼滅儲欏廣?/td>
鏈澶氫竴欏規垨鏇村
+
鍖歸厤鍓嶉潰琛ㄨ揪寮忕殑鑷沖皯涓涓悳绱㈤」銆?/td>
鏈灝?0 欏規垨鏇村
@
鍖歸厤鍓嶉潰琛ㄨ揪寮忕殑 0 涓垨鏇村鎼滅儲欏癸紝鍖歸厤灝藉彲鑳藉皯鐨勫瓧絎︺?/td>
鏈灝戜竴欏規垨鏇村
#
鍖歸厤鍓嶉潰琛ㄨ揪寮忕殑涓涓垨鏇村鎼滅儲欏癸紝鍖歸厤灝藉彲鑳藉皯鐨勫瓧絎︺?/td>
閲嶅 n 嬈?/td>
^n
鍖歸厤鍓嶉潰琛ㄨ揪寮忕殑 n 涓悳绱㈤」銆備緥濡傦紝 [0-9]^4 鍖歸厤浠繪剰 4 浣嶆暟瀛楃殑搴忓垪銆?/td>
瀛楃闆?/td>
[]
鍖歸厤 [] 鍐呯殑浠諱綍涓涓瓧絎︺傝鎸囧畾瀛楃鐨勮寖鍥達紝璇峰垪鍑虹敱鐭垝綰?(-) 鍒嗛殧鐨勮搗濮嬪瓧絎﹀拰緇撴潫瀛楃錛屽 [a-z] 涓墍紺恒?/td>
涓嶅湪瀛楃闆嗕腑鐨勫瓧絎?/td>
[^...]
鍖歸厤璺熷湪 ^ 涔嬪悗鐨勪笉鍦ㄥ瓧絎﹂泦涓殑浠諱綍瀛楃銆?/td>
琛岄
^
灝嗗尮閰嶅畾浣嶅埌琛岄銆?/td>
琛屽熬
$
灝嗗尮閰嶅畾浣嶅埌琛屽熬銆?/td>
璇嶉
<
浠呭綋璇嶅湪鏂囨湰涓殑姝や綅緗紑濮嬫椂鎵嶅尮閰嶃?/td>
璇嶅熬
>
浠呭綋璇嶅湪鏂囨湰涓殑姝や綅緗粨鏉熸椂鎵嶅尮閰嶃?/td>
鍒嗙粍
()
灝嗗瓙琛ㄨ揪寮忓垎緇勩?/td>
鎴?/td>
|
鍖歸厤 OR 絎﹀彿 (|) 涔嬪墠鎴栦箣鍚庣殑琛ㄨ揪寮忋?. 鏈甯哥敤鍦ㄥ垎緇勪腑銆備緥濡傦紝 (sponge|mud) bath 鍖歸厤“sponge bath”鍜?#8220;mud bath”銆?/td>
杞箟絎?/td>
\
鍖歸厤璺熷湪鍙嶆枩鏉?(\) 鍚庣殑瀛楃銆傝繖浣挎偍鍙互鏌ユ壘鍦ㄦ鍒欒〃杈懼紡琛ㄧず娉曚腑浣跨敤鐨勫瓧絎︼紝濡?{ 鍜?^銆備緥濡傦紝 \^ 鎼滅儲 ^ 瀛楃銆?/td>
甯︽爣璁扮殑琛ㄨ揪寮?/td>
{}
鏍囪鎷彿鍐呯殑琛ㄨ揪寮忔墍鍖歸厤鐨勬枃鏈?/td>
絎?n 涓甫鏍囪鐨勬枃鏈?/td>
\n
鍦?#8220;鏌ユ壘”鎴?#8220;鏇挎崲”琛ㄨ揪寮忎腑錛屾寚紺虹 n 涓甫鏍囪鐨勮〃杈懼紡鎵鍖歸厤鐨勬枃鏈紝鍏朵腑 n 鏄粠 1 鑷?9 鐨勬暟瀛椼?
鍙沖榻愬瓧孌?/td>
\(w,n)
鍦?#8220;鏇挎崲”琛ㄨ揪寮忎腑錛屽皢瀛楁涓 n 涓甫鏍囪鐨勮〃杈懼紡鍙沖榻愯嚦灝?w 瀛楃瀹姐?/td>
宸﹀榻愬瓧孌?/td>
\(-w,n)
鍦?#8220;鏇挎崲”琛ㄨ揪寮忎腑錛屽皢瀛楁涓 n 涓甫鏍囪鐨勮〃杈懼紡宸﹀榻愯嚦灝?w 瀛楃瀹姐?/td>
紱佹鍖歸厤
~(X)
褰?X 鍑虹幇鍦ㄨ〃杈懼紡涓殑姝や綅緗椂紱佹鍖歸厤銆備緥濡傦紝 real~(ity)????鍖歸厤“realty”鍜?#8220;really”涓殑“real”錛岃屼笉鍖歸厤“reality”涓殑“real”銆?/td>
瀛楁瘝鏁板瓧瀛楃
:a
鍖歸厤琛ㄨ揪寮?
([a-zA-Z0-9])銆?/td>
瀛楁瘝瀛楃
:c
鍖歸厤琛ㄨ揪寮?br>([a-zA-Z])銆?/td>
鍗佽繘鍒舵暟
:d
鍖歸厤琛ㄨ揪寮?
([0-9])銆?/td>
鍗佸叚榪涘埗鏁?/td>
:h
鍖歸厤琛ㄨ揪寮?
([0-9a-fA-F]+)銆?/td>
鏍囪瘑絎?/td>
:i
鍖歸厤琛ㄨ揪寮?
([a-zA-Z_$][a-zA-Z0-9_$]*)銆?/td>
鏈夌悊鏁?/td>
:n
鍖歸厤琛ㄨ揪寮?
(([0-9]+.[0-9]*)| ([0-9]*.[0-9]+)| ([0-9]+)).
甯﹀紩鍙風殑瀛楃涓?/td>
:q
鍖歸厤琛ㄨ揪寮?(("[^"]*")| ('[^']*'))
瀛楁瘝瀛楃涓?/td>
:w
鍖歸厤琛ㄨ揪寮?
([a-zA-Z]+)
鍗佽繘鍒舵暣鏁?/td>
:z
鍖歸厤琛ㄨ揪寮?
([0-9]+)銆?/td>
杞箟絎?/td>
\e
Unicode U+001B銆?/td>
Bell
\g
Unicode U+0007銆?/td>
閫鏍肩
\h
Unicode U+0008銆?/td>
鎹㈣絎?/td>
\n
鍖歸厤涓庡鉤鍙版棤鍏崇殑鎹㈣絎︺傚湪“鏇挎崲”琛ㄨ揪寮忎腑錛屾彃鍏ユ崲琛岀銆?/td>
鍒惰〃絎?/td>
\t
鍖歸厤鍒惰〃絎︼紝Unicode U+0009銆?/td>
Unicode 瀛楃
\x#### 鎴?\u####
鍖歸厤 Unicode 鍊肩粰瀹氱殑瀛楃錛屽叾涓?#### 鏄崄鍏繘鍒舵暟銆傚彲浠ョ敤 ISO 10646 浠g爜鐐規垨涓や釜鎻愪緵浠g悊欏瑰鐨勫肩殑 Unicode 浠g爜鐐規寚瀹氬熀鏈璇騫抽潰錛堝嵆涓涓唬鐞嗛」錛夊鐨勫瓧絎︺?/td>
琛ㄨ揪寮?/th>
璇硶
璇存槑
澶у啓瀛楁瘝
:Lu
鍖歸厤浠諱綍涓涓ぇ鍐欏瓧姣嶃備緥濡傦紝 :Luhe 鍖歸厤“The”浣嗕笉鍖歸厤“the”銆?/td>
灝忓啓瀛楁瘝
:Ll
鍖歸厤浠諱綍涓涓皬鍐欏瓧姣嶃備緥濡傦紝 :Llhe 鍖歸厤“the”浣嗕笉鍖歸厤“The”銆?/td>
璇嶉澶у啓瀛楁瘝
:Lt
鍖歸厤灝嗗ぇ鍐欏瓧姣嶅拰灝忓啓瀛楁瘝緇撳悎鐨勫瓧絎︼紝渚嬪錛孨j 鍜?Dz銆?/td>
淇グ絎﹀瓧姣?/td>
:Lm
鍖歸厤瀛楁瘝鎴栨爣鐐圭鍙鳳紝渚嬪閫楀彿銆佷氦鍙夐噸闊崇鍜屽弻鎾囧彿錛岀敤浜庤〃紺哄鍓嶄竴瀛楁瘝鐨勪慨楗般?/td>
鍏朵粬瀛楁瘝
:Lo
鍖歸厤鍏朵粬瀛楁瘝錛屽鍝ョ壒浣撳瓧姣?ahsa銆?/td>
鍗佽繘鍒舵暟
:Nd
鍖歸厤鍗佽繘鍒舵暟錛堝 0-9錛夊拰瀹冧滑鐨勫弻瀛楄妭絳夋晥鏁般?/td>
瀛楁瘝鏁板瓧
:Nl
鍖歸厤瀛楁瘝鏁板瓧錛屼緥濡傜綏椹暟瀛楀拰琛ㄦ剰鏁板瓧闆躲?/td>
鍏朵粬鏁板瓧
:No
鍖歸厤鍏朵粬鏁板瓧錛屽鏃ф枩浣撴暟瀛椾竴銆?/td>
寮濮嬫爣鐐圭鍙?/td>
:Ps
鍖歸厤寮濮嬫爣鐐圭鍙鳳紝渚嬪宸︽柟鎷彿鍜屽乏澶ф嫭鍙楓?/td>
緇撴潫鏍囩偣絎﹀彿
:Pe
鍖歸厤緇撴潫鏍囩偣絎﹀彿錛屼緥濡傚彸鏂規嫭鍙峰拰鍙沖ぇ鎷彿銆?/td>
宸﹀紩鍙?/td>
:Pi
鍖歸厤宸﹀弻寮曞彿銆?/td>
鍙沖紩鍙?/td>
:Pf
鍖歸厤鍗曞紩鍙峰拰鍙沖弻寮曞彿銆?
鐮存姌鍙?/td>
:Pd
鍖歸厤鐮存姌鍙鋒爣璁般?/td>
榪炴帴絎﹀彿
:Pc
鍖歸厤涓嬪垝綰挎爣璁般?/td>
鍏朵粬鏍囩偣絎﹀彿
:Po
鍖歸厤閫楀彿 (,)銆?銆?銆?銆丂銆?銆?銆?amp;銆?銆乗銆佸啋鍙?(:)銆佸垎鍙?(;)銆? 鍜?/銆?/td>
絀虹櫧鍒嗛殧絎?/td>
:Zs
鍖歸厤絀虹櫧銆?/td>
琛屽垎闅旂
:Zl
鍖歸厤 Unicode 瀛楃 U+2028銆?/td>
孌佃惤鍒嗛殧絎?/td>
:Zp
鍖歸厤 Unicode 瀛楃 U+2029銆?/td>
鏃犻棿闅旀爣璁?/td>
:Mn
鍖歸厤鏃犻棿闅旀爣璁般?/td>
緇勫悎鏍囪
:Mc
鍖歸厤緇勫悎鏍囪銆?/td>
灝侀棴鏍囪
:Me
鍖歸厤灝侀棴鏍囪銆?
鏁板絎﹀彿
:Sm
鍖歸厤 +銆?銆亊銆亅 銆?lt; 鍜?>銆?/td>
璐у竵絎﹀彿
:Sc
鍖歸厤 $ 鍜屽叾浠栬揣甯佺鍙楓?/td>
淇グ絎﹀彿
:Sk
鍖歸厤淇グ絎﹀彿錛屽鎶戞壃闊熾佹姂闊崇鍙峰拰闀塊煶絎﹀彿銆?/td>
鍏朵粬絎﹀彿
:So
鍖歸厤鍏朵粬絎﹀彿錛屽鐗堟潈絎﹀彿銆佹钀芥爣璁板拰搴︽暟絎﹀彿銆?/td>
鍏朵粬鎺у埗
:Cc
鍖歸厤琛屽熬銆?/td>
鍏朵粬鏍煎紡
:Cf
鏍煎紡鍖栨帶鍒跺瓧絎︼紝渚嬪鍙屽悜鎺у埗瀛楃銆?/td>
浠g悊欏?/td>
:Cs
鍖歸厤浠g悊欏瑰鐨勪竴鍗娿?/td>
鍏朵粬縐佺敤
:Co
鍖歸厤縐佺敤鍖哄煙鐨勪換浣曞瓧絎︺?/td>
鍏朵粬鏈垎閰嶇殑瀛楃
:Cn
鍖歸厤鏈槧灝勫埌 Unicode 瀛楃鐨勫瓧絎︺?/td>
琛ㄨ揪寮?/th>
璇硶
璇存槑
Alpha
:Al
鍖歸厤浠諱綍涓涓瓧絎︺備緥濡傦紝 :Alhe 鍖歸厤“The”銆?#8220;then”銆?#8220;reached”絳夊崟璇嶃?/td>
鏁板瓧
:Nu
鍖歸厤浠諱綍涓涓暟鎴栨暟瀛椼?/td>
鏍囩偣絎﹀彿
:Pu
鍖歸厤浠諱綍涓涓爣鐐圭鍙鳳紝濡??銆丂銆? 絳夌瓑銆?/td>
絀虹櫧
:Wh
鍖歸厤鎵鏈夌被鍨嬬殑絀烘牸錛屽寘鎷嵃鍒峰拰琛ㄦ剰鏂囧瓧鐨勭┖鏍箋?/td>
Bidi
:Bi
鍖歸厤璇稿闃挎媺浼枃鍜屽笇浼潵鏂囪繖綾諱粠鍙沖悜宸︿功鍐欑殑瀛楃銆?/td>
鏈濋矞鏂?/td>
:Ha
鍖歸厤鏈濋矞鏂囧拰緇勫悎鏈濋矞鏂囧瓧姣嶃?/td>
騫沖亣鍚?/td>
:Hi
鍖歸厤騫沖亣鍚嶅瓧絎︺?/td>
鐗囧亣鍚?/td>
:Ka
鍖歸厤鐗囧亣鍚嶅瓧絎︺?/td>
琛ㄦ剰鏂囧瓧/姹夊瓧/鏃ユ枃姹夊瓧
:Id
鍖歸厤琛ㄦ剰鏂囧瓧瀛楃錛屽姹夊瓧鍜屾棩鏂囨眽瀛?/td>
]]>
]]>
鎴栬呯粍浠朵駭鐢熷噯紜殑鏂囨。銆侱oc-O-Matic浣跨敤婧愪唬鐮佷腑鐨勭鍙峰拰娉ㄩ噴浠ュ強澶栭儴鐨勬枃妗?br>鏂囦歡鍒涘緩涓庢祦琛岀殑鏂囨。鏍峰紡涓鑷寸殑鏂囨。銆?/p>
涓殑綾誨眰嬈$粨鏋勩侱ocVizor蹇熷湴浜х敓瀹屾暣鍙緵鎵撳嵃鐨勭被灞傛緇撴瀯鍥撅紝鍖呮嫭浠庣涓?br>鏂瑰簱涓潵鐨勯偅浜涚被錛岄櫎姝や箣澶朌ocVizor榪樿兘浠庣被淇℃伅涓駭鐢烪TML鏂囦歡銆?/p>
++浠g爜鐨勯噸鏋勮兘澶熷敖鍙兘鐨勬湁鏁堢巼鍜岀畝鍗曘?/p>
鎻愬嚭璀﹀憡淇℃伅銆?/p>
C++鐨勭被銆?/p>
鏄啀嬈$紪璇戙?/p>
娣誨姞浜嗗multimethod鐨勬敮鎸併?/p>
鏁板弬鏁般傚畠鏄竴涓紪璇戝櫒鐨勫澹熾?/p>
縐鐨勫紑婧愭祴璇曟鏋躲侰ppUnit 鍜?nbsp;JUnit 涓鏍蜂富瑕佹濇兂鏉ユ簮浜庢瀬闄愮紪紼嬨備富瑕佸姛鑳藉氨
鏄鍗曞厓嫻嬭瘯榪涜綆$悊錛屽茍鍙繘琛岃嚜鍔ㄥ寲嫻嬭瘯銆?/p>
銆銆(3) Cantata++
灞曞崟鍏冩祴璇曞拰闆嗘垚嫻嬭瘯鐨勯渶姹?
yplus/index.shtml
o鍐呰嚜鍔ㄥ寲璋冭瘯榪囩▼鍔犻熷紑鍙戝茍涓旂緝鐭笂甯傜殑鍛ㄦ湡銆侭oundsChecker鎻愪緵娓呮錛岃緇?br>鐨勭▼搴忛敊璇垎鏋愶紝璁稿鏄C++鐙湁鐨勫茍涓斿湪static錛宻tack鍜宧eap鍐呭瓨涓嫻嬪拰璇?br>鏂敊璇紝浠ュ強鍙戠幇鍐呭瓨鍜岃祫婧愮殑娉勬紡銆傘銆(6) Insure++
鍙戣呮彁渚涘畬鏁寸殑閿欒璇婃柇錛屽拰榪愯鏃舵ц兘鍒嗘瀽宸ュ叿鍖呫?/p>
璇?/p>
錛岀洿鍒版爣鍑嗙殑鍑哄彴鎵嶆寮忓畾鍨嬶紝浣嗘槸鍦ㄦ爣鍑嗗簱鐨勫疄鐜頒笂鍗村緢浠や漢嬈f叞寰楃湅鍒板縐嶅疄
鐜幫紝騫朵笖宸茶瀹炶返璇佹槑涓烘湁宸ヤ笟綰у埆寮哄害鐨勪匠浣溿?/p>
鍏禣EM鐨刲icense錛屽湪鍏禖/C++鐨勪駭鍝佷腑閲囩敤Dinkumware鐨勫簱銆?/p>
銆銆Mpl
銆銆Thread
銆銆Python
銆銆smart_ptr
瀵規爣鍑咰++鐨勫己璋冿紝鏄紪鍐欏鉤鍙版棤鍏籌紝鐜頒唬C++鐨勫紑鍙戣呭繀澶囩殑宸ュ叿銆備絾鏄疊oost涓篃
鏈夊緢澶氭槸瀹為獙鎬ц川鐨勪笢瑗匡紝鍦ㄥ疄闄呯殑寮鍙戜腑瀹炵敤闇瑕佽皚鎱庛傚茍涓斿緢澶欱oost涓殑搴撳姛
鑳藉牚縐板璇█鍔熻兘鐨勬墿灞曪紝鍏舵瀯閫犵敤灝界簿宸х殑鎵嬫硶錛屼笉瑕佽錘鐒剁殑鑺辮垂鏃墮棿鐮旇銆侭o
ost鍙﹀涓闈紝姣斿Graph榪欐牱鐨勫簱鍒欐槸鍏鋒湁宸ヤ笟寮哄害錛岀粨鏋勮壇濂斤紝闈炲父鍊煎緱鐮旇鐨?br>綺懼搧浠g爜錛屽茍涓斾篃鍙互鏀懼績鐨勫湪浜у搧浠g爜涓澶氬埄鐢ㄣ?/p>
鍙戜腑錛孏UI搴撶殑閫夋嫨涔熸槸闈炲父閲嶈鐨勪竴浠朵簨鎯咃紝涓嬮潰鎴戜滑緇艱堪涓涓嬪彲閫夋嫨鐨凣UI搴擄紝
鍚勮嚜鐨勭壒鐐逛互鍙婄浉鍏沖伐鍏風殑鏀寔銆?/p>
ws API 涔嬩笂錛岃兘澶熶嬌紼嬪簭鍛樼殑宸ヤ綔鏇村鏄?緙栫▼鏁堢巼楂橈紝鍑忓皯浜嗗ぇ閲忓湪寤虹珛 Windo
ws 紼嬪簭鏃跺繀欏葷紪鍐欑殑浠g爜錛屽悓鏃跺畠榪樻彁渚涗簡鎵鏈変竴鑸?nbsp;C++ 緙栫▼鐨勪紭鐐癸紝渚嬪緇ф壙
鍜屽皝瑁呫侻FC 緙栧啓鐨勭▼搴忓湪鍚勪釜鐗堟湰鐨刉indows鎿嶄綔緋葷粺涓婃槸鍙Щ妞嶇殑錛屼緥濡傦紝鍦?br>Windows 3.1涓嬬紪鍐欑殑浠g爜鍙互寰堝鏄撳湴縐繪鍒?nbsp;Windows NT 鎴?nbsp;Windows 95 涓娿備絾
鏄湪鏈榪戝彂灞曚互鍙婂畼鏂規敮鎸佷笂鏃ユ笎鍔垮井銆?/p>
寰堝鏄撴墿灞曪紝騫朵笖鍏佽鐪熸鍦扮粍浠剁紪紼嬨傝嚜浠?996騫存棭浜涙椂鍊欙紝Qt榪涘叆鍟嗕笟棰嗗煙錛?br>瀹冨凡緇忔垚涓哄叏涓栫晫鑼冨洿鍐呮暟鍗冪鎴愬姛鐨勫簲鐢ㄧ▼搴忕殑鍩虹銆俀t涔熸槸嫻佽鐨凩inux妗岄潰鐜?br>澧僈DE 鐨勫熀紜錛屽悓鏃跺畠榪樻敮鎸乄indows銆丮acintosh銆乁nix/X11絳夊縐嶅鉤鍙般?/p>
鍣ㄥ氨鏄熀浜庤繖涓簱鐨勩?/p>
璇ユ槸浠涔堟牱瀛愮殑鎰熷彈鍑哄彂錛屼粠鑰屽紑濮嬩簡瀵硅繖涓簱鐨勫紑鍙戙傛湁鍏磋叮鐨勫彲浠ュ皾璇曚竴涓嬨?/p>
銆銆(5) WTL
瀵革紝浠ュ強閫熷害浼樺寲鏂歸潰鍋氬緱闈炲父鍒頒綅銆備富瑕侀潰鍚戠殑浣跨敤緹や綋鏄紑鍙慍OM杞婚噺綰т緵緗戠粶
涓嬭澆鐨勫彲瑙嗗寲鎺т歡鐨勫紑鍙戣呫?/p>
Communication Environment錛夋槸鍙互鑷敱浣跨敤銆佸紑鏀炬簮浠g爜鐨勯潰鍚戝璞℃鏋訛紝鍦?br>鍏朵腑瀹炵幇浜嗚澶氱敤浜庡茍鍙戦氫俊杞歡鐨勬牳蹇冩ā寮忋侫CE鎻愪緵浜嗕竴緇勪赴瀵岀殑鍙鐢–++鍖?br>瑁呭瑙傦紙Wrapper Facade錛夊拰妗嗘灦緇勪歡錛屽彲璺ㄨ秺澶氱騫沖彴瀹屾垚閫氱敤鐨勯氫俊杞歡浠誨姟
錛屽叾涓寘鎷細浜嬩歡澶氳礬鍒嗙鍜屼簨浠跺鐞嗗櫒鍒嗘淳銆佷俊鍙峰鐞嗐佹湇鍔″垵濮嬪寲銆佽繘紼嬮棿閫?br>淇°佸叡浜唴瀛樼鐞嗐佹秷鎭礬鐢便佸垎甯冨紡鏈嶅姟鍔ㄦ侊紙閲嶏級閰嶇疆銆佸茍鍙戞墽琛屽拰鍚屾錛岀瓑
絳夈?/p>
tml
銆俋ML楠岃瘉鍦ㄦ枃妗g被鍨嬪畾涔?Document Type Definition錛孌TD)鏂歸潰鏈夊緢濂界殑鏀寔錛?br>騫朵笖鍦?001騫?2鏈堝鍔犱簡鏀寔W3C XML Schema 鐨勫熀鏈畬鏁寸殑寮鏀炬爣鍑嗐?/p>
鐢熺浉搴旂殑GUI紼嬪簭鏉ヤ慨鏀硅繖涓猵arser銆傚湪DOM鍜孲AX涓ゅぇ涓繪祦XML瑙f瀽鍔炴硶涔嬪鎻愪緵浜?br>鍙﹀涓涓彲琛岀殑瑙e喅鏂規銆?/p>
r錛岃繖涓獂pp鎶婅繖灞傛毚闇插嚭鏉ョ洿鎺ョ粰澶у浣跨敤銆傚湪瑕佸厖鍒嗚冭檻閫熷害鐨勬椂鍊欏煎緱灝濊瘯銆?/p>
銆銆(4) Xalan
OM鍜孲AX涔嬪瀵繪眰涓鐐圭伒鎰熴?/p>
鐨勬暟鍊肩▼搴忥紝姣?nbsp;Fortran鎱?0%宸﹀彸錛屽洜姝litz++姝f槸瑕佹敼鎺夎繖涓己鐐廣傛柟娉曟槸鍒?br>鐢–++鐨則emplate鎶鏈紝紼嬪簭鎵ц鐢氳嚦鍙互姣擣ortran鏇村揩銆侭litz++鐩墠浠嶅湪鍙戝睍涓?br>錛屽浜庡父瑙佺殑SVD錛孎FTs錛孮MRES絳夊父瑙佺殑綰挎т唬鏁版柟娉曞茍涓嶆彁渚涳紝涓嶈繃浣跨敤鑰呭彲浠?br>寰堝鏄撳湴鍒╃敤Blitz++鎵鎻愪緵鐨勫嚱鏁版潵鏋勫緩銆?/p>
璞¤璁℃柟渚夸簡蹇熺殑紼嬪簭寮鍙戯紝瀵瑰茍琛屾満鍣ㄨ繘琛屼簡浼樺寲浠ヨ揪鍒版渶楂樼殑鏁堢巼錛屾柟渚垮湪
宸ヤ笟鍜岀爺絀剁幆澧冧腑浣跨敤銆?/p>
鐭╅樀鐨勫ぇ閲忕嚎鎬т唬鏁版柟闈㈢殑鍔熻兘銆傚湪鏌愪簺搴旂敤浣跨敤楂樻ц兘緙栬瘧鍣ㄧ殑鎯呭喌涓嬶紝姣斿In
tel鐨勭紪璇戝櫒錛屼粠浜х敓鐨勬眹緙栦唬鐮佸彲浠ョ湅鍑哄叾涓庢墜鍐欏嚑涔庢病鏈変袱鏍風殑鏁堣兘銆?/p>
閮ㄥ垎閲嶈鐨勮В鍐蟲柟妗堝拰鏂規硶浠++搴撶殑褰㈠紡鎻愪緵緇欏伐涓氬拰瀛︽湳鐣岀殑鐢ㄦ埛銆?/p>
B,浠ュ強S3M錛夛紝鎺у埗鎺ュ彛錛堥敭鐩橈紝榧犳爣鍜岄仴鎰燂級錛孹MS銆?/p>
鍏堢敓涓轟腑鍥芥父鎴忓紑鍙戜簨涓氭墍鍋氬嚭鐨勮礎鐚?/p>
銆傚畠鐨勭洰鐨勬槸璁╁紑鍙戣呰兘鏇存柟渚垮拰鐩存帴鍦板紑鍙戝熀浜?D紜歡璁懼鐨勫簲鐢ㄧ▼搴忔垨娓告垙銆?br>寮曟搸涓殑綾誨簱瀵規洿搴曞眰鐨勭郴緇熷簱錛堝錛欴irect3D鍜孫penGL錛夌殑鍏ㄩ儴浣跨敤緇嗚妭榪涜浜?br>鎶借薄錛屽茍鎻愪緵浜嗗熀浜庣幇瀹炰笘鐣屽璞$殑鎺ュ彛鍜屽叾瀹冪被銆?/p>
涓緢闅劇湅鍒扮殑澶ч噺鐨勭嚎紼嬫柟闈㈢殑鍔熻兘銆?/p>
浠g爜錛屽茍涓旀敮鎸佸綰跨▼鐜鍜孶nicode錛屽悓鏃惰繕鏈夋鍒欒〃杈懼紡鐨勬敮鎸併?/p>
鏈哄埗錛宨/o緋葷粺鍖呮嫭鍩轟簬鎻掍歡鐨勭綉緇滃崗璁忔槑鐨刬/o鏋舵瀯錛屽熀浜庢彃浠剁殑搴旂敤紼嬪簭娑堟伅
鏃ュ織妗嗘灦錛岃闂畇ql鏁版嵁搴撶殑綾葷瓑絳夈?/p>
綰跨▼錛孶nicode錛屽簾鏂欐敹闆嗭紝I/O錛岀綉緇滐紝瀹炵敤宸ュ叿錛孹ML錛岀瓑絳夛級錛屼互鍙婂Java, P
erl, Python, TCL, Lisp, COM 鍜?nbsp;CORBA鐨勯泦鎴愩?/p>
搴撴潵鎻愪緵銆傚悓鏃惰繕鎻愪緵浜嗘櫤鑳芥寚閽堣繖鏍鋒瘮杈冨疄鐢ㄧ殑鍔熻兘銆?/p>
璁炬柦銆?/p>
甯圥eter Norvig鍦?nbsp;“Teach Yourself Programming in Ten Years”涓鏂囦腑灝卞皢鍑?br>鏁板紡璇█鍒椾負鑷沖皯搴斿綋瀛︿範鐨?綾葷紪紼嬭璦涔嬩竴銆?/p>
]]>
銆銆鍔ㄦ佸唴瀛樺垎閰嶅氨鏄寚鍦ㄧ▼搴忔墽琛岀殑榪囩▼涓姩鎬佸湴鍒嗛厤鎴栬呭洖鏀跺瓨鍌ㄧ┖闂寸殑鍒嗛厤鍐呭瓨鐨勬柟娉曘傚姩鎬佸唴瀛樺垎閰嶄笉鍍忔暟緇勭瓑闈欐佸唴瀛樺垎閰嶆柟娉曢偅鏍烽渶瑕侀鍏堝垎閰嶅瓨鍌ㄧ┖闂達紝鑰屾槸鐢辯郴緇熸牴鎹▼搴忕殑闇瑕佸嵆鏃跺垎閰嶏紝涓斿垎閰嶇殑澶у皬灝辨槸紼嬪簭瑕佹眰鐨勫ぇ灝忋傛湰鏂囩畝鍗曚粙緇嶅姩鎬佸唴瀛樺垎閰嶅嚱鏁癿alloc錛堬級鍙婂嚑縐嶅疄鐜版柟娉曘?/p>
銆銆1錛?綆浠?/strong>
銆銆malloc錛堬級鏄疌璇█涓姩鎬佸瓨鍌ㄧ鐞嗙殑涓緇勬爣鍑嗗簱鍑芥暟涔嬩竴銆傚叾浣滅敤鏄湪鍐呭瓨鐨勫姩鎬佸瓨鍌ㄥ尯涓垎閰嶄竴涓暱搴︿負size鐨勮繛緇┖闂淬傚叾鍙傛暟鏄竴涓棤絎﹀彿鏁村艦鏁幫紝榪斿洖鍊兼槸涓涓寚鍚戞墍鍒嗛厤鐨勮繛緇瓨鍌ㄥ煙鐨勮搗濮嬪湴鍧鐨勬寚閽堛傝繕鏈変竴鐐瑰繀欏繪敞鎰忕殑鏄紝褰撳嚱鏁版湭鑳芥垚鍔熷垎閰嶅瓨鍌ㄧ┖闂達紙濡傚唴瀛樹笉瓚籌級灝變細榪斿洖涓涓狽ULL鎸囬拡銆傛墍浠ュ湪璋冪敤璇ュ嚱鏁版椂搴旇媯嫻嬭繑鍥炲兼槸鍚︿負NULL騫舵墽琛岀浉搴旂殑鎿嶄綔銆?/p>
銆銆2錛?鍑芥暟璇存槑
銆銆C璇█鐨勫姩鎬佸瓨鍌ㄧ鐞嗙敱涓緇勬爣鍑嗗簱鍑芥暟瀹炵幇錛屽叾鍘熷瀷鍦ㄦ爣鍑嗘枃浠?lt;stdlib.h>閲屾弿榪幫紝闇瑕佺敤榪欎簺鍔熻兘鏃跺簲鍖呭惈榪欎釜鏂囦歡銆備笌鍔ㄦ佸瓨鍌ㄥ垎閰嶆湁鍏崇殑鍑芥暟鍏辨湁鍥涗釜錛屽叾涓氨鍖呮嫭瀛樺偍鍒嗛厤鍑芥暟malloc錛堬級銆傚嚱鏁板師鍨嬫槸錛歷oid *malloc (size_t n);榪欓噷鐨剆ize_t鏄爣鍑嗗簱閲屽畾涔夌殑涓涓被鍨嬶紝瀹冩槸涓涓棤絎﹀彿鏁村瀷銆傝繖涓暣鍨嬭兘澶熸弧瓚蟲墍鏈夊瀛樺偍鍧楀ぇ灝忔弿榪扮殑闇瑕侊紝鍏蜂綋鐩稿綋浜庡摢涓暣鍨嬬敱鍏蜂綋鐨凜緋葷粺紜畾銆俶alloc鐨勮繑鍥炲間負(void *)綾誨瀷錛堣繖鏄氱敤鎸囬拡鐨勪竴涓噸瑕佺敤閫旓級錛屽畠鍒嗛厤涓鐗囪兘瀛樻斁澶у皬涓簄鐨勬暟鎹殑瀛樺偍鍧楋紝榪斿洖瀵瑰簲鐨勬寚閽堝鹼紱濡傛灉涓嶈兘婊¤凍鐢寵錛堟壘涓嶅埌鑳芥弧瓚寵姹傜殑瀛樺偍鍧楋級灝辮繑鍥濶ULL銆傚湪浣跨敤鏃訛紝搴旇鎶妋alloc鐨勮繑鍥炲艱漿鎹㈠埌鐗瑰畾鎸囬拡綾誨瀷錛岃祴緇欎竴涓寚閽堛?/p>
銆銆 娉ㄦ剰錛岃櫧鐒惰繖閲岀殑瀛樺偍鍧楁槸閫氳繃鍔ㄦ佸垎閰嶅緱鍒扮殑錛屼絾鏄畠鐨勫ぇ灝忎篃鏄‘瀹氱殑錛屽悓鏍蜂笉鍏佽瓚婄晫浣跨敤銆備緥濡備笂闈㈢▼搴忔鍒嗛厤鐨勫潡閲岃兘瀛榥涓弻綺懼害鏁版嵁錛岄殢鍚庣殑浣跨敤灝卞繀欏誨湪榪欎釜鑼冨洿鍐呰繘琛屻傝秺鐣屼嬌鐢ㄥ姩鎬佸垎閰嶇殑瀛樺偍鍧楋紝灝ゅ叾鏄秺鐣岃祴鍊鹼紝鍙兘寮曡搗闈炲父涓ラ噸鐨勫悗鏋滐紝閫氬父浼氱牬鍧忕▼搴忕殑榪愯緋葷粺錛屽彲鑳介犳垚鏈▼搴忔垨鑰呮暣涓綆楁満緋葷粺鍨彴銆?/p>
銆銆涓嬩緥鏄竴涓姩鎬佸垎閰嶇殑渚嬪瓙錛?br>#include <stdlib.h>
main()
{
銆int count,*array; /*count鏄竴涓鏁板櫒錛宎rray鏄竴涓暣鍨嬫寚閽堬紝涔熷彲浠ョ悊瑙d負鎸囧悜涓涓暣鍨嬫暟緇勭殑棣栧湴鍧*/
銆if((array(int *) malloc (10*sizeof(int)))==NULL)
銆{
銆銆printf("涓嶈兘鎴愬姛鍒嗛厤瀛樺偍絀洪棿銆?);
銆銆exit(1);
銆}
銆for (count=0;count銆?0;count++) /*緇欐暟緇勮祴鍊?/
銆銆array[count]=count;
銆for(count=0;count銆?0;count++) /*鎵撳嵃鏁扮粍鍏冪礌*/
銆銆printf("%2d",array[count]);
}
銆銆涓婁緥涓姩鎬佸垎閰嶄簡10涓暣鍨嬪瓨鍌ㄥ尯鍩燂紝鐒跺悗榪涜璧嬪煎茍鎵撳嵃銆備緥涓璱f((array(int *) malloc (10*sizeof(int)))==NULL)璇彞鍙互鍒嗕負浠ヤ笅鍑犳錛?br>銆銆1錛夊垎閰?0涓暣鍨嬬殑榪炵畫瀛樺偍絀洪棿錛屽茍榪斿洖涓涓寚鍚戝叾璧峰鍦板潃鐨勬暣鍨嬫寚閽?br>銆銆2錛夋妸姝ゆ暣鍨嬫寚閽堝湴鍧璧嬬粰array
銆銆3錛夋嫻嬭繑鍥炲兼槸鍚︿負NULL
銆銆3錛?malloc錛堬級宸ヤ綔鏈哄埗
銆銆malloc鍑芥暟鐨勫疄璐ㄤ綋鐜板湪錛屽畠鏈変竴涓皢鍙敤鐨勫唴瀛樺潡榪炴帴涓轟竴涓暱闀跨殑鍒楄〃鐨勬墍璋撶┖闂查摼琛ㄣ傝皟鐢╩alloc鍑芥暟鏃訛紝瀹冩部榪炴帴琛ㄥ鎵句竴涓ぇ鍒拌凍浠ユ弧瓚崇敤鎴瘋姹傛墍闇瑕佺殑鍐呭瓨鍧椼傜劧鍚庯紝灝嗚鍐呭瓨鍧椾竴鍒嗕負浜岋紙涓鍧楃殑澶у皬涓庣敤鎴瘋姹傜殑澶у皬鐩哥瓑錛屽彟涓鍧楃殑澶у皬灝辨槸鍓╀笅鐨勫瓧鑺傦級銆傛帴涓嬫潵錛屽皢鍒嗛厤緇欑敤鎴風殑閭e潡鍐呭瓨浼犵粰鐢ㄦ埛錛屽茍灝嗗墿涓嬬殑閭e潡錛堝鏋滄湁鐨勮瘽錛夎繑鍥炲埌榪炴帴琛ㄤ笂銆傝皟鐢╢ree鍑芥暟鏃訛紝瀹冨皢鐢ㄦ埛閲婃斁鐨勫唴瀛樺潡榪炴帴鍒扮┖闂查摼涓娿傚埌鏈鍚庯紝絀洪棽閾句細琚垏鎴愬緢澶氱殑灝忓唴瀛樼墖孌碉紝濡傛灉榪欐椂鐢ㄦ埛鐢寵涓涓ぇ鐨勫唴瀛樼墖孌碉紝閭d箞絀洪棽閾句笂鍙兘娌℃湁鍙互婊¤凍鐢ㄦ埛瑕佹眰鐨勭墖孌典簡銆備簬鏄紝malloc鍑芥暟璇鋒眰寤舵椂錛屽茍寮濮嬪湪絀洪棽閾句笂緲葷鍊掓煖鍦版鏌ュ悇鍐呭瓨鐗囨錛屽瀹冧滑榪涜鏁寸悊錛屽皢鐩擱偦鐨勫皬絀洪棽鍧楀悎騫舵垚杈冨ぇ鐨勫唴瀛樺潡銆?/p>
銆銆4錛?malloc錛堬級鍦ㄦ搷浣滅郴緇熶腑鐨勫疄鐜?/strong>
銆銆鍦?C 紼嬪簭涓紝澶氭浣跨敤malloc () 鍜?free()銆備笉榪囷紝鎮ㄥ彲鑳芥病鏈夌敤涓浜涙椂闂村幓鎬濊冨畠浠湪鎮ㄧ殑鎿嶄綔緋葷粺涓槸濡備綍瀹炵幇鐨勩傛湰鑺傚皢鍚戞偍灞曠ず malloc 鍜?free 鐨勪竴涓渶綆鍖栧疄鐜扮殑浠g爜錛屾潵甯姪璇存槑綆$悊鍐呭瓨鏃墮兘娑夊強鍒頒簡鍝簺浜嬫儏銆?/p>
銆銆鍦ㄥぇ閮ㄥ垎鎿嶄綔緋葷粺涓紝鍐呭瓨鍒嗛厤鐢變互涓嬩袱涓畝鍗曠殑鍑芥暟鏉ュ鐞嗭細
銆銆void *malloc (long numbytes)錛氳鍑芥暟璐熻矗鍒嗛厤 numbytes 澶у皬鐨勫唴瀛橈紝騫惰繑鍥炴寚鍚戠涓涓瓧鑺傜殑鎸囬拡銆?/p>
銆銆void free(void *firstbyte)錛氬鏋滅粰瀹氫竴涓敱鍏堝墠鐨?malloc 榪斿洖鐨勬寚閽堬紝閭d箞璇ュ嚱鏁頒細灝嗗垎閰嶇殑絀洪棿褰掕繕緇欒繘紼嬬殑“絀洪棽絀洪棿”銆?/p>
銆銆malloc_init 灝嗘槸鍒濆鍖栧唴瀛樺垎閰嶇▼搴忕殑鍑芥暟銆傚畠瑕佸畬鎴愪互涓嬩笁浠朵簨錛氬皢鍒嗛厤紼嬪簭鏍囪瘑涓哄凡緇忓垵濮嬪寲錛屾壘鍒扮郴緇熶腑鏈鍚庝竴涓湁鏁堝唴瀛樺湴鍧錛岀劧鍚庡緩绔嬭搗鎸囧悜鎴戜滑綆$悊鐨勫唴瀛樼殑鎸囬拡銆傝繖涓変釜鍙橀噺閮芥槸鍏ㄥ眬鍙橀噺錛?/p>
銆銆娓呭崟 1. 鎴戜滑鐨勭畝鍗曞垎閰嶇▼搴忕殑鍏ㄥ眬鍙橀噺
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;
銆銆濡傚墠鎵榪幫紝琚槧灝勭殑鍐呭瓨鐨勮竟鐣岋紙鏈鍚庝竴涓湁鏁堝湴鍧錛夊父琚О涓虹郴緇熶腑鏂偣鎴栬?褰撳墠涓柇鐐廣傚湪寰堝 UNIX? 緋葷粺涓紝涓轟簡鎸囧嚭褰撳墠緋葷粺涓柇鐐癸紝蹇呴』浣跨敤 sbrk(0) 鍑芥暟銆?sbrk 鏍規嵁鍙傛暟涓粰鍑虹殑瀛楄妭鏁扮Щ鍔ㄥ綋鍓嶇郴緇熶腑鏂偣錛岀劧鍚庤繑鍥炴柊鐨勭郴緇熶腑鏂偣銆備嬌鐢ㄥ弬鏁?0 鍙槸榪斿洖褰撳墠涓柇鐐廣傝繖閲屾槸鎴戜滑鐨?malloc 鍒濆鍖栦唬鐮侊紝瀹冨皢鎵懼埌褰撳墠涓柇鐐瑰茍鍒濆鍖栨垜浠殑鍙橀噺錛?/p>
銆銆娓呭崟 2. 鍒嗛厤紼嬪簭鍒濆鍖栧嚱鏁?br>/* Include the sbrk function */
#include
void malloc_init()
{
/* grab the last valid address from the OS */
last_valid_address = sbrk(0);
/* we don't have any memory to manage yet, so
*just set the beginning to be last_valid_address
*/
managed_memory_start = last_valid_address;
/* Okay, we're initialized and ready to go */
has_initialized = 1;
}
銆銆鐜板湪錛屼負浜嗗畬鍏ㄥ湴綆$悊鍐呭瓨錛屾垜浠渶瑕佽兘澶熻拷韙鍒嗛厤鍜屽洖鏀跺摢浜涘唴瀛樸傚湪瀵瑰唴瀛樺潡榪涜浜?free 璋冪敤涔嬪悗錛屾垜浠渶瑕佸仛鐨勬槸璇稿灝嗗畠浠爣璁頒負鏈浣跨敤鐨勭瓑浜嬫儏錛屽茍涓旓紝鍦ㄨ皟鐢?malloc 鏃訛紝鎴戜滑瑕佽兘澶熷畾浣嶆湭琚嬌鐢ㄧ殑鍐呭瓨鍧椼傚洜姝わ紝 malloc 榪斿洖鐨勬瘡鍧楀唴瀛樼殑璧峰澶勯鍏堣鏈夎繖涓粨鏋勶細
銆銆娓呭崟 3. 鍐呭瓨鎺у埗鍧楃粨鏋勫畾涔?br>struct mem_control_block {
int is_available;
int size;
};
銆銆 鐜板湪錛屾偍鍙兘浼氳涓哄綋紼嬪簭璋冪敤 malloc 鏃惰繖浼氬紩鍙戦棶棰?鈥斺?瀹冧滑濡備綍鐭ラ亾榪欎釜緇撴瀯錛熺瓟妗堟槸瀹冧滑涓嶅繀鐭ラ亾錛涘湪榪斿洖鎸囬拡涔嬪墠錛屾垜浠細灝嗗叾縐誨姩鍒拌繖涓粨鏋勪箣鍚庯紝鎶婂畠闅愯棌璧鋒潵銆傝繖浣垮緱榪斿洖鐨勬寚閽堟寚鍚戞病鏈夌敤浜庝換浣曞叾浠栫敤閫旂殑鍐呭瓨銆傞偅鏍鳳紝浠庤皟鐢ㄧ▼搴忕殑瑙掑害鏉ョ湅錛屽畠浠墍寰楀埌鐨勫叏閮ㄦ槸絀洪棽鐨勩佸紑鏀劇殑鍐呭瓨銆傜劧鍚庯紝褰撻氳繃 free() 灝嗚鎸囬拡浼犻掑洖鏉ユ椂錛屾垜浠彧闇瑕佸掗鍑犱釜鍐呭瓨瀛楄妭灝卞彲浠ュ啀嬈℃壘鍒拌繖涓粨鏋勩?/p>
銆銆鍦ㄨ璁哄垎閰嶅唴瀛樹箣鍓嶏紝鎴戜滑灝嗗厛璁ㄨ閲婃斁錛屽洜涓哄畠鏇寸畝鍗曘備負浜嗛噴鏀懼唴瀛橈紝鎴戜滑蹇呴』瑕佸仛鐨勬儫涓涓浠朵簨鎯呭氨鏄紝鑾峰緱鎴戜滑緇欏嚭鐨勬寚閽堬紝鍥為 sizeof(struct mem_control_block) 涓瓧鑺傦紝騫跺皢鍏舵爣璁頒負鍙敤鐨勩傝繖閲屾槸瀵瑰簲鐨勪唬鐮侊細
銆銆娓呭崟 4. 瑙i櫎鍒嗛厤鍑芥暟
void free(void *firstbyte) {
struct mem_control_block *mcb;
/* Backup from the given pointer to find the
* mem_control_block
*/
mcb = firstbyte - sizeof(struct mem_control_block);
/* Mark the block as being available */
mcb->is_available = 1;
/* That's It! We're done. */
return;
}
銆銆濡傛偍鎵瑙侊紝鍦ㄨ繖涓垎閰嶇▼搴忎腑錛屽唴瀛樼殑閲婃斁浣跨敤浜嗕竴涓潪甯哥畝鍗曠殑鏈哄埗錛屽湪鍥哄畾鏃墮棿鍐呭畬鎴愬唴瀛橀噴鏀俱傚垎閰嶅唴瀛樼◢寰洶闅句竴浜涖備互涓嬫槸璇ョ畻娉曠殑鐣ヨ堪錛?/p>
銆銆娓呭崟 5. 涓誨垎閰嶇▼搴忕殑浼唬鐮?br>1. If our allocator has not been initialized, initialize it.
2. Add sizeof(struct mem_control_block) to the size requested.
3. start at managed_memory_start.
4. Are we at last_valid address?
5. If we are:
A. We didn't find any existing space that was large enough
-- ask the operating system for more and return that.
6. Otherwise:
A. Is the current space available (check is_available from
the mem_control_block)?
B. If it is:
i) Is it large enough (check "size" from the
mem_control_block)?
ii) If so:
a. Mark it as unavailable
b. Move past mem_control_block and return the
pointer
iii) Otherwise:
a. Move forward "size" bytes
b. Go back go step 4
C. Otherwise:
i) Move forward "size" bytes
ii) Go back to step 4
銆銆鎴戜滑涓昏浣跨敤榪炴帴鐨勬寚閽堥亶鍘嗗唴瀛樻潵瀵繪壘寮鏀劇殑鍐呭瓨鍧椼傝繖閲屾槸浠g爜錛?/p>
銆銆娓呭崟 6. 涓誨垎閰嶇▼搴?br>void *malloc(long numbytes) {
/* Holds where we are looking in memory */
void *current_location;
/* This is the same as current_location, but cast to a
* memory_control_block
*/
struct mem_control_block *current_location_mcb;
/* This is the memory location we will return. It will
* be set to 0 until we find something suitable
*/
void *memory_location;
/* Initialize if we haven't already done so */
if(! has_initialized) {
malloc_init();
}
/* The memory we search for has to include the memory
* control block, but the users of malloc don't need
* to know this, so we'll just add it in for them.
*/
numbytes = numbytes + sizeof(struct mem_control_block);
/* Set memory_location to 0 until we find a suitable
* location
*/
memory_location = 0;
/* Begin searching at the start of managed memory */
current_location = managed_memory_start;
/* Keep going until we have searched all allocated space */
while(current_location != last_valid_address)
{
/* current_location and current_location_mcb point
* to the same address. However, current_location_mcb
* is of the correct type, so we can use it as a struct.
* current_location is a void pointer so we can use it
* to calculate addresses.
*/
current_location_mcb =
(struct mem_control_block *)current_location;
if(current_location_mcb->is_available)
{
if(current_location_mcb->size >= numbytes)
{
/* Woohoo! We've found an open,
* appropriately-size location.
*/
/* It is no longer available */
current_location_mcb->is_available = 0;
/* We own it */
memory_location = current_location;
/* Leave the loop */
break;
}
}
/* If we made it here, it's because the Current memory
* block not suitable; move to the next one
*/
current_location = current_location +
current_location_mcb->size;
}
/* If we still don't have a valid location, we'll
* have to ask the operating system for more memory
*/
if(! memory_location)
{
/* Move the program break numbytes further */
sbrk(numbytes);
/* The new memory will be where the last valid
* address left off
*/
memory_location = last_valid_address;
/* We'll move the last valid address forward
* numbytes
*/
last_valid_address = last_valid_address + numbytes;
/* We need to initialize the mem_control_block */
current_location_mcb = memory_location;
current_location_mcb->is_available = 0;
current_location_mcb->size = numbytes;
}
/* Now, no matter what (well, except for error conditions),
* memory_location has the address of the memory, including
* the mem_control_block
*/
/* Move the pointer past the mem_control_block */
memory_location = memory_location + sizeof(struct mem_control_block);
/* Return the pointer */
return memory_location;
}
銆銆榪欏氨鏄垜浠殑鍐呭瓨綆$悊鍣ㄣ傜幇鍦紝鎴戜滑鍙渶瑕佹瀯寤哄畠錛屽茍鍦ㄧ▼搴忎腑浣跨敤瀹冨嵆鍙?br>
銆銆5錛?malloc錛堬級鐨勫叾浠栧疄鐜?/p>
銆銆malloc() 鐨勫疄鐜版湁寰堝錛岃繖浜涘疄鐜板悇鏈変紭鐐逛笌緙虹偣銆傚湪璁捐涓涓垎閰嶇▼搴忔椂錛岃闈復璁稿闇瑕佹姌琛風殑閫夋嫨錛屽叾涓寘鎷細
鍒嗛厤鐨勯熷害銆?
鍥炴敹鐨勯熷害銆?
鏈夌嚎紼嬬殑鐜鐨勮涓恒?
鍐呭瓨灝嗚琚敤鍏夋椂鐨勮涓恒?
灞閮ㄧ紦瀛樸?
綈胯錛圔ookkeeping錛夊唴瀛樺紑閿銆?
铏氭嫙鍐呭瓨鐜涓殑琛屼負銆?
灝忕殑鎴栬呭ぇ鐨勫璞°?
瀹炴椂淇濊瘉銆?br>姣忎竴涓疄鐜伴兘鏈夊叾鑷韓鐨勪紭緙虹偣闆嗗悎銆傚湪鎴戜滑鐨勭畝鍗曠殑鍒嗛厤紼嬪簭涓紝鍒嗛厤闈炲父鎱紝鑰屽洖鏀墮潪甯稿揩銆傚彟澶栵紝鐢變簬瀹冨湪浣跨敤铏氭嫙鍐呭瓨緋葷粺鏂歸潰杈冨樊錛屾墍浠ュ畠鏈閫備簬澶勭悊澶х殑瀵硅薄銆?/p>
銆銆榪樻湁鍏朵粬璁稿鍒嗛厤紼嬪簭鍙互浣跨敤銆傚叾涓寘鎷細
銆銆Doug Lea Malloc錛欴oug Lea Malloc 瀹為檯涓婃槸瀹屾暣鐨勪竴緇勫垎閰嶇▼搴忥紝鍏朵腑鍖呮嫭 Doug Lea 鐨勫師濮嬪垎閰嶇▼搴忥紝GNU libc 鍒嗛厤紼嬪簭鍜?ptmalloc銆?Doug Lea 鐨勫垎閰嶇▼搴忔湁鐫涓庢垜浠殑鐗堟湰闈炲父綾諱技鐨勫熀鏈粨鏋勶紝浣嗘槸瀹冨姞鍏ヤ簡绱㈠紩錛岃繖浣垮緱鎼滅儲閫熷害鏇村揩錛屽茍涓斿彲浠ュ皢澶氫釜娌℃湁琚嬌鐢ㄧ殑鍧楃粍鍚堜負涓涓ぇ鐨勫潡銆傚畠榪樻敮鎸佺紦瀛橈紝浠ヤ究鏇村揩鍦板啀嬈′嬌鐢ㄦ渶榪戦噴鏀劇殑鍐呭瓨銆?ptmalloc 鏄?Doug Lea Malloc 鐨勪竴涓墿灞曠増鏈紝鏀寔澶氱嚎紼嬨傚湪鏈枃鍚庨潰鐨?鍙傝冭祫鏂欓儴鍒嗕腑錛屾湁涓綃囨弿榪?Doug Lea 鐨?Malloc 瀹炵幇鐨勬枃绔犮?/p>
銆銆BSD Malloc錛欱SD Malloc 鏄殢 4.2 BSD 鍙戣鐨勫疄鐜幫紝鍖呭惈鍦?FreeBSD 涔嬩腑錛岃繖涓垎閰嶇▼搴忓彲浠ヤ粠棰勫厛紜疄澶у皬鐨勫璞℃瀯鎴愮殑姹犱腑鍒嗛厤瀵硅薄銆傚畠鏈変竴浜涚敤浜庡璞″ぇ灝忕殑 size 綾伙紝榪欎簺瀵硅薄鐨勫ぇ灝忎負 2 鐨勮嫢騫叉騫傚噺鍘繪煇涓甯告暟銆傛墍浠ワ紝濡傛灉鎮ㄨ姹傜粰瀹氬ぇ灝忕殑涓涓璞★紝瀹冨氨綆鍗曞湴鍒嗛厤涓涓笌涔嬪尮閰嶇殑 size 綾匯傝繖鏍峰氨鎻愪緵浜嗕竴涓揩閫熺殑瀹炵幇錛屼絾鏄彲鑳戒細嫻垂鍐呭瓨銆傚湪 鍙傝冭祫鏂欓儴鍒嗕腑錛屾湁涓綃囨弿榪拌瀹炵幇鐨勬枃绔犮?/p>
銆銆Hoard錛氱紪鍐?Hoard 鐨勭洰鏍囨槸浣垮唴瀛樺垎閰嶅湪澶氱嚎紼嬬幆澧冧腑榪涜寰楅潪甯稿揩銆傚洜姝わ紝瀹冪殑鏋勯犱互閿佺殑浣跨敤涓轟腑蹇冿紝浠庤屼嬌鎵鏈夎繘紼嬩笉蹇呯瓑寰呭垎閰嶅唴瀛樸傚畠鍙互鏄捐憲鍦板姞蹇偅浜涜繘琛屽緢澶氬垎閰嶅拰鍥炴敹鐨勫綰跨▼榪涚▼鐨勯熷害銆傚湪 鍙傝冭祫鏂欓儴鍒嗕腑錛屾湁涓綃囨弿榪拌瀹炵幇鐨勬枃绔犮?br>浼楀鍙敤鐨勫垎閰嶇▼搴忎腑鏈鏈夊悕鐨勫氨鏄笂榪拌繖浜涘垎閰嶇▼搴忋傚鏋滄偍鐨勭▼搴忔湁鐗瑰埆鐨勫垎閰嶉渶姹傦紝閭d箞鎮ㄥ彲鑳芥洿鎰挎剰緙栧啓涓涓畾鍒剁殑鑳藉尮閰嶆偍鐨勭▼搴忓唴瀛樺垎閰嶆柟寮忕殑鍒嗛厤紼嬪簭銆備笉榪囷紝濡傛灉涓嶇啛鎮夊垎閰嶇▼搴忕殑璁捐錛岄偅涔堝畾鍒跺垎閰嶇▼搴忛氬父浼氬甫鏉ユ瘮瀹冧滑瑙e喅鐨勯棶棰樻洿澶氱殑闂銆?/p>
銆銆6錛?緇撴潫璇?/strong>
銆銆鍓嶉潰宸茬粡鎻愯繃錛屽嬈¤皟鐢╩alloc錛堬級鍚庣┖闂插唴瀛樿鍒囨垚寰堝鐨勫皬鍐呭瓨鐗囨錛岃繖灝變嬌寰楃敤鎴峰湪鐢寵鍐呭瓨浣跨敤鏃訛紝鐢變簬鎵句笉鍒拌凍澶熷ぇ鐨勫唴瀛樼┖闂達紝malloc錛堬級闇瑕佽繘琛屽唴瀛樻暣鐞嗭紝浣垮緱鍑芥暟鐨勬ц兘瓚婃潵瓚婁綆銆傝仾鏄庣殑紼嬪簭鍛橀氳繃鎬繪槸鍒嗛厤澶у皬涓?鐨勫箓鐨勫唴瀛樺潡錛岃屾渶澶ч檺搴﹀湴闄嶄綆娼滃湪鐨刴alloc鎬ц兘涓уけ銆備篃灝辨槸璇達紝鎵鍒嗛厤鐨勫唴瀛樺潡澶у皬涓?瀛楄妭銆?瀛楄妭銆?6瀛楄妭銆?8446744073709551616瀛楄妭錛岀瓑絳夈傝繖鏍峰仛鏈澶ч檺搴﹀湴鍑忓皯浜嗚繘鍏ョ┖闂查摼鐨勬紓鐗囨錛堝悇縐嶅昂瀵哥殑灝忕墖孌甸兘鏈夛級鐨勬暟閲忋傚敖綆$湅璧鋒潵榪欏ソ鍍忔氮璐逛簡絀洪棿錛屼絾涔熷鏄撶湅鍑烘氮璐圭殑絀洪棿姘歌繙涓嶄細瓚呰繃50%銆?/p>
銆銆鍙傝冩枃鐚細
銆銆[1] Jonathan Bartlett錛屽唴瀛樼鐞嗗唴騫? developerWorks 涓浗錛?004騫?1鏈?/p>
濡傛灉瀹瑰櫒鏄痸ector銆乻tring鎴杁eque錛屼嬌鐢╡rase-remove鎯敤娉曘?/p>
濡傛灉瀹瑰櫒鏄痩ist錛屼嬌鐢╨ist::remove銆?/p>
濡傛灉瀹瑰櫒鏄爣鍑嗗叧鑱斿鍣紝浣跨敤瀹冪殑erase鎴愬憳鍑芥暟銆?/p>
濡傛灉瀹瑰櫒鏄痸ector銆乻tring鎴杁eque錛屼嬌鐢╡rase-remove_if鎯敤娉曘?/p>
濡傛灉瀹瑰櫒鏄痩ist錛屼嬌鐢╨ist::remove_if銆?/p>
濡傛灉瀹瑰櫒鏄爣鍑嗗叧鑱斿鍣紝浣跨敤remove_copy_if鍜宻wap錛屾垨鍐欎竴涓驚鐜潵閬嶅巻瀹瑰櫒鍏冪礌錛屽綋浣犳妸榪唬鍣ㄤ紶緇檈rase鏃惰寰楀悗緗掑瀹冦?/p>
濡傛灉瀹瑰櫒鏄爣鍑嗗簭鍒楀鍣紝鍐欎竴涓驚鐜潵閬嶅巻瀹瑰櫒鍏冪礌錛屾瘡褰撹皟鐢╡rase鏃惰寰楅兘鐢ㄥ畠鐨勮繑鍥炲兼洿鏂頒綘鐨勮凱浠e櫒銆?/p>
濡傛灉瀹瑰櫒鏄爣鍑嗗叧鑱斿鍣紝鍐欎竴涓驚鐜潵閬嶅巻瀹瑰櫒鍏冪礌錛屽綋浣犳妸榪唬鍣ㄤ紶緇檈rase鏃惰寰楀悗緗掑瀹冦?/p>