锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 婧愭枃绔犳潵鑷墠C++鏍囧噯濮斿憳浼氱殑 Danny Kalev 鐨?nbsp;The Biggest Changes in C++11 (and Why You Should Care)錛岃禆鍕囨旦鍋氫簡涓涓?a target="_blank">涓枃緲昏瘧鍦ㄨ繖閲?/a>銆傛墍浠ワ紝鎴戝氨涓嶇炕璇戜簡錛屾垜鍦ㄨ繖閲屼粎瀵規枃涓彁鍒扮殑榪欎簺鍙樺寲“榪介棶涓轟粈涔堣寮曞叆榪欎簺鍙樺寲”鐨勪竴涓帰璁紝鍙湁鐭ラ亾涓轟簡浠涔堬紝鐢ㄥ湪浠涔堝湴鏂癸紝鎴戜滑鎵嶈兘鐪熸瀛﹀埌榪欎釜鐭ヨ瘑銆傝屼互姝や綘鍙互鏇存繁鍏ュ湴浜嗚В榪欎簺鍙樺寲銆傛墍浠ワ紝鏈枃涓嶆槸緲昏瘧銆傚洜涓哄啓寰楁湁浜涗粨淇冿紝鎵浠ラ毦鍏嶆湁闂錛岃繕璇峰ぇ瀹舵寚姝c?/p>
Lambda琛ㄨ揪寮忔潵婧愪簬鍑芥暟寮忕紪紼嬶紝璇寸櫧灝變簡灝辨槸鍦ㄤ嬌鐢ㄧ殑鍦版柟瀹氫箟鍑芥暟錛屾湁鐨勮璦鍙?#8220;闂寘”錛屽鏋?lambda 鍑芥暟娌℃湁浼犲洖鍊?渚嬪 void )錛屽叾鍥炶繑綾誨瀷鍙瀹屽叏蹇界暐銆?瀹氫箟鍦ㄤ笌 lambda 鍑芥暟鐩稿悓浣滅敤鍩熺殑鍙橀噺鍙傝冧篃鍙互琚嬌鐢ㄣ傝繖縐嶇殑鍙橀噺闆嗗悎涓鑸縐頒綔 closure錛堥棴鍖咃級銆傛垜鍦ㄨ繖閲屽氨涓嶅啀璁茶繖涓簨浜嗐傝〃杈懼紡鐨勭畝鍗曡娉曞涓嬶紝 鍘熸枃鐨勪綔鑰呯粰鍑轟簡涓嬮潰鐨勪緥瀛愶細 鍦ㄤ紶緇熺殑STL涓璮or_each() 榪欎釜鐜╂剰鏈鍚庨偅涓弬鏁伴渶瑕佷竴涓?#8220;鍑芥暟瀵硅薄”錛屾墍璋撳嚱鏁板璞★紝鍏跺疄鏄竴涓猚lass錛岃繖涓猚lass閲嶈澆浜唎perator()錛屼簬鏄繖涓璞″彲浠ュ儚鍑芥暟鐨勫紡鏍風殑浣跨敤銆傚疄鐜頒竴涓嚱鏁板璞″茍涓嶅鏄擄紝闇瑕佷嬌鐢╰emplate錛屾瘮濡備笅闈㈣繖涓緥瀛愬氨鏄嚱鏁板璞$殑綆鍗曚緥瀛愶紙瀹為檯鐨勫疄鐜拌繙姣旇繖涓鏉傦級錛?/p>
鎵浠ワ紝C++寮曞叆Lambda鐨勬渶涓昏鍘熷洜灝辨槸1錛夊彲浠ュ畾涔夊尶鍚嶅嚱鏁幫紝2錛夌紪璇戝櫒浼氭妸鍏惰漿鎴愬嚱鏁板璞?/strong>銆傜浉淇′綘浼氬拰鎴戜竴鏍鳳紝浼氱枒闂負浠涔堜互鍓峉TL涓殑ptr_fun()榪欎釜鍑芥暟瀵硅薄涓嶈兘鐢紵錛坧tr_fun()灝辨槸鎶婁竴涓嚜鐒跺嚱鏁拌漿鎴愬嚱鏁板璞$殑錛夈傚師鍥犳槸錛宲tr_fun() 鐨勫眬闄愭槸鍏舵帴鏀剁殑鑷劧鍑芥暟鍙兘鏈?鎴?涓弬鏁般?/p>
閭d箞錛岄櫎浜嗘柟渚垮錛屼負浠涔堜竴瀹氳浣跨敤Lambda鍛紵瀹冩瘮浼犵粺鐨勫嚱鏁版垨鏄嚱鏁板璞℃湁浠涔堝ソ澶勫憿錛熸垜涓漢鎵鐞嗚В鐨勬槸錛岃繖縐嶅嚱鏁頒箣騫翠互鍙?#8220;闂寘”錛屽氨鏄洜涓哄叾闄愬埗浜嗗埆浜虹殑璁塊棶錛屾洿縐佹湁銆備篃鍙互璁や負浠栨槸涓嬈℃х殑鏂規硶銆侺ambda琛ㄨ揪寮忓簲璇ユ槸綆媧佺殑錛屾瀬縐佹湁鐨勶紝涓轟簡鏇存槗鐨勪唬鐮佸拰鏇存柟渚跨殑緙栫▼銆?/p>
鍦ㄨ繖涓鑺備腑錛屽師鏂囦富瑕佷粙緇嶄簡涓や釜鍏抽敭瀛?auto 鍜?deltype錛岀ず渚嬪涓嬶細 auto 鏈澶х殑濂藉灝辨槸璁╀唬鐮佺畝媧侊紝灝ゅ叾鏄偅浜涙ā鏉跨被鐨勫0鏄庯紝姣斿錛歋TL涓殑瀹瑰櫒鐨勮凱浠e瓙綾誨瀷銆?/p>
鍙互鍙樻垚錛?/p>
妯℃澘榪欎釜鐗規цC++鐨勪唬鐮佸彉寰楀緢闅捐錛屼笉淇′綘鍙互鐪嬬湅STL鐨勬簮鐮侊紝閭f槸涓涓貢鍟娿備嬌鐢╝uto蹇呴渶涓涓垵濮嬪寲鍊鹼紝緙栬瘧鍣ㄥ彲浠ラ氳繃榪欎釜鍒濆鍖栧兼帹瀵煎嚭綾誨瀷銆傚洜涓篴uto鏄潵綆鍖栨ā鏉跨被寮曞叆鐨勪唬鐮侀毦璇葷殑闂錛屽涓婇潰鐨勭ず渚嬶紝iteration榪欑綾誨瀷灝辨渶閫傚悎鐢╝uto鐨勶紝浣嗘槸錛屾垜浠笉搴旇鎶婂叾婊ョ敤銆?/p>
姣斿涓嬮潰鐨勪唬鐮佺殑鍙鎬у氨闄嶄綆浜嗐傚洜涓猴紝鎴戜笉鐭ラ亾ProcessData榪斿洖浠涔堬紵int? bool? 榪樻槸瀵硅薄錛熸垨鏄埆鐨勪粈涔堬紵榪欒浣犲悗闈㈢殑紼嬪簭涓嶇煡閬撴庝箞鍋氥?/p>
浣嗘槸涓嬮潰鐨勭▼搴忓氨娌℃湁闂錛屽洜涓簆Object鐨勫瀷鍒湪鍚庨潰鐨刵ew涓湁浜嗐?/p>
鍏充簬 鍘熸枃緇欏嚭鐨勭ず渚嬪涓嬶紝鎴戜滑鍙互鐪嬪埌錛岃繖涓鐨勭‘鎴戜滑鐨勫畾涔夊彉閲忕渷浜嗗緢澶氫簨銆?/p>
榪樻湁涓涓傚悎鐨勭敤娉曟槸鐢ㄦ潵typedef鍑芥暟鎸囬拡錛屼篃浼氱渷寰堝浜嬨傛瘮濡傦細 Wikipedia 涓婃槸榪欎箞璇寸殑錛堝叧浜巇ecltype鐨勮鍒欒涓婏級 濡傛灉auto 鍜?decltype 鍦ㄤ竴璧蜂嬌鐢ㄤ細鏄粈涔堟牱瀛愶紵鑳界湅涓嬮潰鐨勭ず渚嬶紝涓嬮潰榪欎釜紺轟緥涔熸槸寮曞叆decltype鐨勪竴涓師鍥?#8212;—璁〤++鏈夎兘鍔涘啓涓涓?“ forwarding function 妯℃澘”錛?/p>
榪欎釜鍑芥暟妯℃澘鐪嬭搗鏉ョ浉褰撹垂瑙o紝鍏剁敤鍒頒簡auto 鍜?decltype 鏉ユ墿灞曚簡宸叉湁鐨勬ā鏉挎妧鏈殑涓嶈凍銆傛庝箞涓笉瓚沖憿錛熷湪涓婁緥涓紝鎴戜笉鐭ラ亾AddingFunc浼氭帴鏀朵粈涔堟牱綾誨瀷鐨勫璞★紝榪欎袱涓璞$殑 + 鎿嶄綔絎﹁繑鍥炵殑綾誨瀷涔熶笉鐭ラ亾錛岃佺殑妯℃澘鍑芥暟鏃犳硶瀹氫箟AddingFunc榪斿洖鍊煎拰榪欎袱涓璞$浉鍔犲悗鐨勮繑鍥炲煎尮閰嶏紝鎵浠ワ紝浣犲彲浠ヤ嬌鐢ㄤ笂榪扮殑榪欑瀹氫箟銆?/p>
C/C++鐨勫垵濮嬪寲鐨勬柟娉曟瘮杈冿紝C++ 11 鐢ㄥぇ鎷彿緇熶竴浜嗚繖浜涘垵濮嬪寲鐨勬柟娉曘?/p>
姣斿錛歅OD鐨勭被鍨嬨?/p>
鍏充簬POD鐩歌涓ゅ彞錛屾墍璋揚OD灝辨槸Plain Old Data錛屽綋class/struct鏄?em>鏋佺畝鐨?trivial)銆佸睘浜?em>鏍囧噯甯冨眬(standard-layout)錛屼互鍙婁粬鐨勬墍鏈夐潪闈欐侊紙non-static錛夋垚鍛橀兘鏄疨OD鏃訛紝浼氳瑙嗕負POD銆傚錛?/p>
POD鐨勫垵濮嬪寲鏈夌偣鎬紝姣斿涓婁緥錛宯ew A; 鍜宯ew A(); 鏄笉涓鏍風殑錛屽浜庡叾鍐呴儴鐨刴錛屽墠鑰呮病鏈夎鍒濆鍖栵紝鍚庤呰鍒濆鍖栦簡錛堜笉鍚?鐨勭紪璇戝櫒琛屼負涓嶄竴鏍鳳紝VC++鍜孏CC涓嶄竴鏍鳳級銆傝岄潪POD鐨勫垵濮嬪寲錛屽垯閮戒細琚垵濮嬪寲銆?/p>
浠庤繖鐐瑰彲浠ョ湅鍑猴紝C/C++鐨勫垵濮嬪寲闂寰堝鎬紝鎵浠ワ紝鍦–++ 2011鐗堜腑灝卞仛浜嗙粺涓銆傚師鏂囦綔鑰呯粰鍑轟簡濡備笅鐨勭ず渚嬶細 瀹瑰櫒鐨勫垵濮嬪寲錛?/p>
榪樻敮鎸佸儚Java涓鏍風殑鎴愬憳鍒濆鍖栵細 鎴戜滑鐭ラ亾C++鐨勭紪璇戝櫒鍦ㄤ綘娌℃湁瀹氫箟鏌愪簺鎴愬憳鍑芥暟鐨勬椂鍊欎細緇欎綘鐨勭被鑷姩鐢熸垚榪欎簺鍑芥暟錛屾瘮濡傦紝鏋勯犲嚱鏁幫紝鎷瘋礉鏋勯狅紝鏋愭瀯鍑芥暟錛岃祴鍊煎嚱鏁般傛湁浜涙椂鍊欙紝鎴戜滑涓嶆兂瑕佽繖浜涘嚱鏁幫紝姣斿錛屾瀯閫犲嚱鏁幫紝鍥犱負鎴戜滑鎯沖仛瀹炵幇鍗曚緥妯″紡銆備紶緇熺殑鍋氭硶鏄皢鍏跺0鏄庢垚private綾誨瀷銆?/p>
鍦ㄦ柊鐨凜++涓紩鍏ヤ簡涓や釜鎸囩ず絎︼紝delete鎰忎負鍛婅瘔緙栬瘧鍣ㄤ笉鑷姩浜х敓榪欎釜鍑芥暟錛宒efault鍛婅瘔緙栬瘧鍣ㄤ駭鐢熶竴涓粯璁ょ殑銆傚師鏂囩粰鍑轟簡涓嬮潰涓や釜渚嬪瓙錛?/p>
鍐嶅delete 榪欓噷錛屾垜鎯寵涓涓嬶紝涓轟粈涔堟垜浠渶瑕乨efault錛熸垜浠涔堥兘涓嶅啓涓嶅氨鏄痙efault鍚楋紵涓嶅叏鐒舵槸錛屾瘮濡傛瀯閫犲嚱鏁幫紝鍥犱負鍙浣犲畾涔変簡涓涓瀯閫犲嚱鏁幫紝緙栬瘧鍣ㄥ氨涓嶄細緇欎綘鐢熸垚涓涓粯璁ょ殑浜嗐傛墍浠ワ紝涓轟簡瑕佽榛樿鐨勫拰鑷畾涔夌殑鍏卞瓨錛屾墠寮曞叆榪欎釜鍙傛暟錛屽涓嬩緥鎵紺猴細 鍏充簬delete榪樻湁涓や釜鏈夌敤鐨勫湴鏂規槸 1錛夎浣犵殑瀵硅薄鍙兘鐢熸垚鍦ㄦ爤鍐呭瓨涓婏細 2錛夐樆姝㈠嚱鏁扮殑鍏跺艦鍙傜殑綾誨瀷璋冪敤錛氾紙鑻ュ皾璇曚互 double 鐨勫艦鍙傝皟鐢?nbsp; C/C++鐨凬ULL瀹忔槸涓鏈夊緢澶氭綔鍦˙UG鐨勫畯銆傚洜涓烘湁鐨勫簱鎶婂叾瀹氫箟鎴愭暣鏁?錛屾湁鐨勫畾涔夋垚 (void*)0銆傚湪C鐨勬椂浠h繕濂姐備絾鏄湪C++鐨勬椂浠o紝榪欏氨浼氬紩鍙戝緢澶氶棶棰樸備綘鍙互涓婄綉鐪嬬湅銆傝繖鏄負浠涔堥渶瑕?nbsp; 鍦ㄤ互鍓嶇殑C++涓紝鏋勯犲嚱鏁頒箣闂翠笉鑳戒簰鐩歌皟鐢紝鎵浠ワ紝鎴戜滑鍦ㄥ啓榪欎簺鐩鎬技鐨勬瀯閫犲嚱鏁伴噷錛屾垜浠細鎶婄浉鍚岀殑浠g爜鏀懼埌涓涓鏈夌殑鎴愬憳鍑芥暟涓?/p>
浣嗘槸錛屼負浜嗘柟渚垮茍涓嶈凍璁?#8220;濮旀墭鏋勯?#8221;榪欎釜浜嬪嚭鐜幫紝鏈涓昏鐨勯棶棰樻槸錛屽熀綾葷殑鏋勯犱笉鑳界洿鎺ユ垚涓烘淳鐢熺被鐨勬瀯閫狅紝灝辯畻鏄熀綾葷殑鏋勯犲嚱鏁板浜嗭紝媧劇敓綾昏繕瑕佽嚜宸卞啓鑷繁鐨勬瀯閫犲嚱鏁幫細 涓婁緥涓紝媧劇敓綾繪墜鍔ㄧ戶鎵垮熀綾葷殑鏋勯犲嚱鏁幫紝 緙栬瘧鍣ㄥ彲浠ヤ嬌鐢ㄥ熀綾葷殑鏋勯犲嚱鏁板畬鎴愭淳鐢熺被鐨勬瀯閫犮?鑰屽皢鍩虹被鐨勬瀯閫犲嚱鏁板甫鍏ユ淳鐢熺被鐨勫姩浣?鏃犳硶閫夋嫨鎬у湴閮ㄥ垎甯﹀叆錛?鎵浠ワ紝瑕佷笉灝辨槸緇ф壙鍩虹被鍏ㄩ儴鐨勬瀯閫犲嚱鏁幫紝瑕佷笉灝辨槸涓涓兘涓嶇戶鎵?涓嶆墜鍔ㄥ甫鍏?銆?姝ゅ錛岃嫢鐗墊秹鍒板閲嶇戶鎵匡紝浠庡涓熀綾葷戶鎵胯屾潵鐨勬瀯閫犲嚱鏁頒笉鍙互鏈夌浉鍚岀殑鍑芥暟絳懼悕(signature)銆?鑰屾淳鐢熺被鐨勬柊鍔犲叆鐨勬瀯閫犲嚱鏁頒篃涓嶅彲浠ュ拰緇ф壙鑰屾潵鐨勫熀綾繪瀯閫犲嚱鏁版湁鐩稿悓鐨勫嚱鏁扮鍚嶏紝鍥犱負榪欑浉褰撲簬閲嶅澹版槑銆傦紙鎵璋撳嚱鏁扮鍚嶅氨鏄嚱鏁扮殑鍙傛暟綾誨瀷鍜岄『搴忎笉錛?/p>
鍦ㄨ佺増鐨凜++涓紝涓存椂鎬у彉閲忥紙縐頒負鍙沖?#8221;R-values”錛屼綅浜庤祴鍊兼搷浣滅涔嬪彸錛夌粡甯哥敤浣滀氦鎹袱涓彉閲忋傛瘮濡備笅闈㈢殑紺轟緥涓殑tmp鍙橀噺銆傜ず渚嬩腑鐨勯偅涓嚱鏁伴渶瑕佷紶閫掍袱涓猻tring鐨勫紩鐢紝浣嗘槸鍦ㄤ氦鎹㈢殑榪囩▼涓駭鐢熶簡瀵硅薄鐨勬瀯閫狅紝鍐呭瓨鐨勫垎閰嶈繕鏈夊璞$殑鎷瘋礉鏋勯犵瓑絳夊姩浣滐紝鎴愭湰姣旇緝楂樸?/p>
C++ 11澧炲姞涓涓柊鐨勫紩鐢紙reference錛夌被鍨嬬О浣滃彸鍊煎紩鐢紙R-value reference錛夛紝鏍囪涓?tt>typename &&銆備粬浠兘澶熶互non-const鍊肩殑鏂瑰紡浼犲叆錛屽厑璁稿璞″幓鏀瑰姩浠栦滑銆傝繖欏逛慨姝e厑璁哥壒瀹氬璞″垱閫犲嚭move璇箟銆?/p>
涓句緥鑰岃█錛屼笂闈㈤偅涓緥瀛愪腑錛宻tring綾諱腑淇濆瓨浜嗕竴涓姩鎬佸唴瀛樺垎瀛樼殑char*鎸囬拡錛屽鏋滀竴涓猻tring瀵硅薄鍙戠敓鎷瘋礉鏋勯狅紙濡傦細鍑芥暟榪斿洖錛夛紝string綾婚噷鐨刢har*鍐呭瓨鍙兘閫氳繃鍒涘緩涓涓柊鐨勪復鏃跺璞★紝騫舵妸鍑芥暟鍐呯殑瀵硅薄鐨勫唴瀛榗opy鍒拌繖涓柊鐨勫璞′腑錛岀劧鍚庨攢姣佷復鏃跺璞″強鍏跺唴瀛樸?strong>榪欐槸鍘熸潵C++鎬ц兘涓婇噸鐐硅鎵硅瘎鐨勪簨 鑳借繃鍙沖煎紩鐢紝string鐨勬瀯閫犲嚱鏁伴渶瑕佹敼鎴?#8220;move鏋勯犲嚱鏁?#8221;錛屽涓嬫墍紺恒傝繖鏍蜂竴鏉ワ紝浣垮緱瀵規煇涓?span style="font-family: monospace">stirng鐨勫彸鍊煎紩鐢ㄥ彲浠ュ崟綰湴浠庡彸鍊煎鍒跺叾鍐呴儴C-style鐨勬寚閽堝埌鏂扮殑string錛岀劧鍚庣暀涓嬬┖鐨勫彸鍊箋傝繖涓搷浣滀笉闇瑕佸唴瀛樻暟緇勭殑澶嶅埗錛岃屼笖絀虹殑鏆傛椂瀵硅薄鐨勬瀽鏋勪篃涓嶄細閲婃斁鍐呭瓨銆傚叾鏇存湁鏁堢巼銆?/p>
The C++11 STL涓箍娉涘湴浣跨敤浜嗗彸鍊煎紩鐢ㄥ拰move璇銆傚洜姝わ紝寰堝綆楁硶鍜屽鍣ㄧ殑鎬ц兘閮借浼樺寲浜嗐?/p>
C++ STL搴撳湪2003騫寸粡鍘嗕簡寰堝ぇ鐨勬暣瀹規墜鏈?nbsp;Library Technical Report 1 (TR1)銆?TR1 涓嚭鐜頒簡寰堝鏂扮殑瀹瑰櫒綾?( 榪欎滑灝變笉澶氳浜嗭紝浠ュ墠鐨凷TL楗卞彈綰跨▼瀹夊叏鐨勬壒璇勩傜幇鍦ㄥソ 浜嗐侰++ 11 鏀寔綰跨▼綾諱簡銆傝繖灝嗘秹鍙婁袱涓儴鍒嗭細絎竴銆佽璁′竴涓彲浠ヤ嬌澶氫釜綰跨▼鍦ㄤ竴涓繘紼嬩腑鍏卞瓨鐨勫唴瀛樻ā鍨嬶紱絎簩銆佷負綰跨▼涔嬮棿鐨勪氦浜掓彁渚涙敮鎸併傜浜岄儴鍒嗗皢鐢辯▼搴忓簱鎻愪緵鏀寔銆傚ぇ瀹跺彲浠ョ湅鐪?a target="_blank">promises and futures錛屽叾鐢ㄤ簬瀵硅薄鐨勫悓姝ャ?nbsp;async() 鍑芥暟妯℃澘鐢ㄤ簬鍙戣搗騫跺彂浠誨姟錛岃?nbsp;thread_local 涓虹嚎紼嬪唴鐨勬暟鎹寚瀹氬瓨鍌ㄧ被鍨嬨傛洿澶氱殑涓滆タ錛屽彲浠ユ煡鐪?Anthony Williams鐨?nbsp;Simpler Multithreading in C++0x. C++98 鐨勭煡鑳芥寚閽堟槸 涓轟粈涔堣榪欎箞騫詫紵澶у鍙互鐪嬬湅銆奙ore Effective C++銆嬩腑瀵?auto_ptr鐨勮璁恒?/p>
瀹氫箟浜嗕竴浜涙柊鐨勭畻娉曪細 浣跨敤鏂扮殑copy_n()綆楁硶錛屼綘鍙互寰堟柟渚垮湴鎷瘋礉鏁扮粍銆?/p>
浣跨敤 鎬諱箣錛岀湅涓嬫潵錛孋++11 榪樻槸寰堝闄㈡淳錛屽緢澶氬疄鐢ㄧ殑涓滆タ榪樻槸娌℃湁錛屾瘮濡傦細 XML錛宻ockets錛宺eflection錛屽綋鐒惰繕鏈夊瀮鍦懼洖鏀躲傜湅鏉ヨ絳夊埌C++ 20浜嗐傚懙鍛點備笉榪嘋++ 11鍦ㄦц兘涓婅繕鏄緢蹇傚弬鐪?Google’s benchmark tests銆傚師鏂囪繕寮曠敤Stroustrup 鐨勮鐐癸細C++11 鏄竴闂ㄦ柊鐨勮璦——涓涓洿濂界殑 C++銆?/p>
濡傛灉鎶婃墍鏈夌殑鏀瑰彉閮藉垪鍑烘潵錛屼綘浼氬彂鐜扮湡澶氬晩銆傛垜浼拌C++ Primer閭f湰涔︾殑鍘氬害瑕佸鍔犺嚦灝?0%浠ヤ笂銆侰++鐨勯棬妲涗細涓嶄細瓚婃潵瓚婇珮浜嗗憿錛熸垜涓嶇煡閬擄紝浣嗘垜涓漢瑙夊緱榪欓棬璇█鐨勭‘鏄彉寰楄秺鏉ヨ秺浠や漢鏈涜屽嵈姝ヤ簡銆傦紙鎯寵搗浜嗘煇浜哄拰鎴戣鐨勪竴鍙ヨ瘽——瀛︽妧鏈湡鐨勬槸澶瘡浜嗭紝榪樻槸鎼炴柟娉曡濂芥販浜涳紵錛?/p> Status Of C++ 0x Language Features in Compilers C++ 0x FEATURE PAPER(S) HP aCC EDG eccp Sun/ Oracle C++ Digital Mars C++ alignas 4.8 3.0 alignof 4.5 Yes 2.9 Atomic operations 4.4 13.0 11.0 3.1 auto 4.1(v0.9) 4.4(v1.0) 11.0(v0.9) 10.0(v0.9) 11.1 (V1.0) Yes C99 preprocessor 4.3 11.1 10.1 5.9 Yes Yes Concepts [removed] constexpr 4.6 13.0 12.1 3.1 decltype 4.1(v1.0) 4.3(v1.0) 4.8.1(v1.1) 11.0(v1.0) 10.0(v1.0), 11.0(v1.1) 11.1 (V1.0) Yes 2.9 Defaulted And Deleted Functions 4.1 4.4 12.0 3.0 Delegating Constructors 4.7 11.0 nov'12 11.1 3.0 Explicit conversion operators 4.5 13.0 11.0 nov'12 12.1 Yes 3.0 Extended friend Declarations 4.1 4.7 11.0 10.0*** V1R11,11.1 2.9 extern template 3, 5, 6 3.3 9 6.0 V1R11,11.1 Yes Yes Forward declarations for enums 4.6 11.0 12.1 3.1 Inheriting Constructors 4.8 Initializer Lists 4.4 13.0 11.0 nov'12 3.1 Lambda expressions and closures 4.1(v0.9) 4.5(v1.1) 11.0(v0.9) 10.0(v1.0), 11.0(v1.1) 3.1 Local and Unnamed Types as Template Arguments 4.5 12.0 10.0 2.9 long long Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Namespace Association 4.4 11.1 2.9 New character types 4.4 2.9 New function declaration syntax for deduced return types 4.1 4.4 12.1 10.0 12.1 2.9 nullptr 4.6 12.1* 10.0 2.9 Unicode String Literals 4.4 11.0* 5.7 Yes 3.0 Raw String Literals 4.5 11.0 nov'12 Yes User-defined Literals 4.7 3.1 Right Angle Brackets 4.1 4.3 11.0 8.0 12.1 Yes R-Value References, std::move 4.1(v1.0) 4.3(v1.0) 11.1(v1.0) 10.0(v2.0), 11.0(v2.1) 12.1(v2.1) Yes Yes static_assert 4.1 4.3 11.0 10.0 11.1 Yes 2.9 Strongly-typed enums 4.4 12.0 11.0 12.1 Yes 2.9 Template aliases 4.7 12.1 3.0 Thread-Local Storage 4.8 (4.4****) 11.1*** 10.0*** 5.9*** 2.9**** Unrestricted Unions 4.6 3.0 Built-in Type Traits 6.16 4.0 4.3 10.0 8.0 Yes 3.0 Variadic Templates 4.1(v0.9) 4.3(v0.9) 4.4(v1.0) 12.1(v0.9) 11.0 nov'12 11.1 (v0.9) 2.9(1.0) Range-based for-loop 4.6 13.0 11.0 3.0 override and final 4.7 12.0(v0.8)*** 8.0(v0.8)*** 11.0(v1.0) 2.9 Attributes 4.8 12.1 ref-qualifiers 4.8.1 2.9 Non-static data member initializers 4.7 3.0 Dynamic initialization and destruction with concurrency (Magic statics) 4.3 ? 2.9 * — 1) unicode string literals is a feature of the EDG frontend, but it is undocumented at Intel C++ compiler (/Qoption,cpp,"--uliterals" option enables it) gprof鏄疓NU profiler宸ュ叿銆傚彲浠ユ樉紺虹▼搴忚繍琛岀殑“flat profile”錛屽寘鎷瘡涓嚱鏁扮殑璋冪敤嬈℃暟錛屾瘡涓嚱鏁版秷鑰楃殑澶勭悊鍣ㄦ椂闂淬備篃鍙互鏄劇ず“璋冪敤鍥?#8221;錛屽寘鎷嚱鏁扮殑璋冪敤鍏崇郴錛屾瘡涓嚱鏁拌皟鐢ㄨ姳璐逛簡澶氬皯鏃墮棿銆傝繕鍙互鏄劇ず“娉ㄩ噴鐨勬簮浠g爜”錛屾槸紼嬪簭婧愪唬鐮佺殑涓涓鏈紝鏍囪鏈夌▼搴忎腑姣忚浠g爜鐨勬墽琛屾鏁般?/p>
1錛?浣跨敤 -pg 緙栬瘧鍜岄摼鎺ヤ綘鐨勫簲鐢ㄧ▼搴忋?/p>
2錛?鎵ц浣犵殑搴旂敤紼嬪簭浣夸箣鐢熸垚渚沢prof 鍒嗘瀽鐨勬暟鎹?
3錛?浣跨敤gprof 紼嬪簭鍒嗘瀽浣犵殑搴旂敤紼嬪簭鐢熸垚鐨勬暟鎹?
$gprof -b a.out gmon.out Each sample counts as 0.01 seconds. % cumulative self self total Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name Index by function name
[1] function
gprof [鍙墽琛屾枃浠禲 [gmon.out鏂囦歡] [鍏跺畠鍙傛暟]
鏂規嫭鍙蜂腑鐨勫唴瀹瑰彲浠ョ渷鐣ャ傚鏋滅渷鐣ヤ簡“鍙墽琛屾枃浠?#8221;錛実prof浼氬湪褰撳墠鐩綍涓嬫悳绱.out鏂囦歡浣滀負鍙墽琛屾枃浠訛紝鑰屽鏋滅渷鐣ヤ簡gmon.out鏂囦歡錛実prof涔熶細鍦ㄥ綋鍓嶇洰褰曚笅瀵繪壘gmon.out銆傚叾瀹冨弬鏁板彲浠ユ帶鍒秅prof杈撳嚭鍐呭鐨勬牸寮忕瓑淇℃伅銆傛渶甯哥敤鐨勫弬鏁板涓嬶細
l -b 涓嶅啀杈撳嚭緇熻鍥捐〃涓瘡涓瓧孌電殑璇︾粏鎻忚堪銆?
l -p 鍙緭鍑哄嚱鏁扮殑璋冪敤鍥撅紙Call graph鐨勯偅閮ㄥ垎淇℃伅錛夈?
l -q 鍙緭鍑哄嚱鏁扮殑鏃墮棿娑堣楀垪琛ㄣ?
l -e Name 涓嶅啀杈撳嚭鍑芥暟Name 鍙婂叾瀛愬嚱鏁扮殑璋冪敤鍥撅紙闄ら潪瀹冧滑鏈夋湭琚檺鍒剁殑鍏跺畠鐖跺嚱鏁幫級銆傚彲浠ョ粰瀹氬涓?-e 鏍囧織銆備竴涓?-e 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?
l -E Name 涓嶅啀杈撳嚭鍑芥暟Name 鍙婂叾瀛愬嚱鏁扮殑璋冪敤鍥撅紝姝ゆ爣蹇楃被浼間簬 -e 鏍囧織錛屼絾瀹冨湪鎬繪椂闂村拰鐧懼垎姣旀椂闂寸殑璁$畻涓帓闄や簡鐢卞嚱鏁癗ame 鍙婂叾瀛愬嚱鏁版墍鐢ㄧ殑鏃墮棿銆?
l -f Name 杈撳嚭鍑芥暟Name 鍙婂叾瀛愬嚱鏁扮殑璋冪敤鍥俱傚彲浠ユ寚瀹氬涓?-f 鏍囧織銆備竴涓?-f 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?
l -F Name 杈撳嚭鍑芥暟Name 鍙婂叾瀛愬嚱鏁扮殑璋冪敤鍥撅紝瀹冪被浼間簬 -f 鏍囧織錛屼絾瀹冨湪鎬繪椂闂村拰鐧懼垎姣旀椂闂磋綆椾腑浠呬嬌鐢ㄦ墍鎵撳嵃鐨勪緥紼嬬殑鏃墮棿銆傚彲浠ユ寚瀹氬涓?-F 鏍囧織銆備竴涓?-F 鏍囧織鍙兘鎸囧畾涓涓嚱鏁般?F 鏍囧織瑕嗙洊 -E 鏍囧織銆?
l -z 鏄劇ず浣跨敤嬈℃暟涓洪浂鐨勪緥紼嬶紙鎸夌収璋冪敤璁℃暟鍜岀瘡縐椂闂磋綆楋級銆?
涓嶈繃,gprof涓嶈兘鏄劇ず瀵硅薄涔嬮棿鐨勭戶鎵垮叧緋?榪欎篃鏄畠鐨勫急鐐? 杞澆鏉ユ簮錛?a >http://blog.csdn.net/dragonbooker/article/details/6173321 銆銆鎵璋撶殑澶х妯″紡錛屾槸鎸囨暟鎹殑浣庝綅錛堝氨鏄潈鍊艱緝灝忕殑鍚庨潰閭e嚑浣嶏級淇濆瓨鍦ㄥ唴瀛樼殑楂樺湴鍧涓紝鑰屾暟鎹殑楂樹綅錛屼繚瀛樺湪鍐呭瓨鐨勪綆鍦板潃涓紝榪欐牱鐨勫瓨鍌ㄦā寮忔湁鐐瑰効綾諱技浜庢妸鏁版嵁褰撲綔瀛楃涓查『搴忓鐞嗭細鍦板潃鐢卞皬鍚戝ぇ澧炲姞錛岃屾暟鎹粠楂樹綅寰浣庝綅鏀撅紱 灝忕妯″紡 銆銆鎵璋撶殑灝忕妯″紡錛屾槸鎸囨暟鎹殑浣庝綅淇濆瓨鍦ㄥ唴瀛樼殑浣庡湴鍧涓紝鑰屾暟 鎹殑楂樹綅淇濆瓨鍦ㄥ唴瀛樼殑楂樺湴鍧涓紝榪欑瀛樺偍妯″紡灝嗗湴鍧鐨勯珮浣庡拰鏁版嵁浣嶆潈鏈夋晥鍦扮粨鍚堣搗鏉ワ紝楂樺湴鍧閮ㄥ垎鏉冨奸珮錛屼綆鍦板潃閮ㄥ垎鏉冨間綆錛屽拰鎴戜滑鐨勯昏緫鏂規硶涓鑷淬?/span> 涓轟粈涔堟湁澶у皬绔ā寮忎箣鍒?/span> 涓轟粈涔堜細鏈夊ぇ灝忕妯″紡涔嬪垎鍛紵榪欐槸鍥犱負鍦ㄨ綆楁満緋葷粺涓紝鎴戜滑鏄互瀛楄妭涓哄崟浣嶇殑錛屾瘡涓湴鍧鍗曞厓閮藉搴旂潃涓涓瓧鑺傦紝涓涓瓧鑺備負 8bit銆備絾鏄湪C璇█涓櫎浜?/span>8bit鐨?/span>char涔嬪錛岃繕鏈?/span>16bit鐨?/span>short鍨嬶紝32bit鐨?/span>long鍨嬶紙瑕佺湅鍏蜂綋鐨勭紪璇戝櫒錛夛紝鍙﹀錛屽浜庝綅鏁板ぇ浜?/span> 8浣嶇殑澶勭悊鍣紝渚嬪16浣嶆垨鑰?/span>32浣嶇殑澶勭悊鍣紝鐢變簬瀵勫瓨鍣ㄥ搴﹀ぇ浜庝竴涓瓧鑺傦紝閭d箞蹇呯劧瀛樺湪鐫涓涓浣曞皢澶氫釜瀛楄妭瀹夋帓鐨勯棶棰樸傚洜姝ゅ氨瀵艱嚧浜嗗ぇ绔瓨鍌ㄦā寮忓拰灝忕瀛樺偍妯″紡銆備緥濡備竴涓?/span>16bit鐨?/span>short鍨?/span>x錛屽湪鍐呭瓨涓殑鍦板潃涓?/span>0x0010錛?/span>x鐨勫間負0x1122錛岄偅涔?/span>0x11涓洪珮瀛楄妭錛?/span>0x22涓轟綆瀛楄妭銆傚浜?/span> 澶х妯″紡錛屽氨灝?/span>0x11鏀懼湪浣庡湴鍧涓紝鍗?/span>0x0010涓紝0x22鏀懼湪楂樺湴鍧涓紝鍗?/span>0x0011涓傚皬绔ā寮忥紝鍒氬ソ鐩稿弽銆傛垜浠父鐢ㄧ殑X86緇撴瀯鏄皬绔ā寮忥紝鑰?/span>KEIL C51鍒欎負澶х妯″紡銆傚緢澶氱殑ARM錛?/span>DSP閮戒負灝忕妯″紡銆傛湁浜?/span>ARM澶勭悊鍣ㄨ繕鍙互鐢辯‖浠舵潵閫夋嫨鏄ぇ绔ā寮忚繕鏄皬绔ā寮忋?/span> 澶у閮界煡閬撳瓧絎?#8216;A’鐨?/span>ASCII鐮佸間負65錛堝崄榪涘埗錛変篃灝辨槸0x41錛岄偅涔堣繖涓煎湪涓嶅悓澶у皬绔ā寮忕殑緋葷粺涓瓨鏀劇殑鏂瑰紡鍒嗗埆涓猴細 澶х妯″紡錛?/span>00 00 00 41 -----楂樹綆妯″紡 灝忕妯″紡錛?/span>41 00 00 00 -----浣庝綆妯″紡 鍙互閫氳繃澹版槑涓涓仈鍚堬紙union錛夊垽鏂ぇ灝忕妯″紡錛?/span> /** * 鏂規硶涓 寰楀埌褰撳墠緋葷粺鐨勫ぇ灝忕灞炴?/span>, 姝ゆ柟娉曡淇濊瘉鍦?/span>32浣嶆満嫻嬭瘯 */ static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } }; 銆銆 #define ENDIANNESS ((char)endian_test.l) /** * 鏂規硶浜?/span>: 寰楀埌褰撳墠緋葷粺鐨勫ぇ灝忕灞炴?/span> */ static union { short n; char c[sizeof(short)]; }un; int getEndian() { un.n = 0x0102; if ((un.c[0] == 1 && un.c[1] == 2)) { printf("big endian/n"); } else if ((un.c[0] == 2 && un.c[1] == 1)) { printf("little endian/n"); } else printf("error!/n"); return 0; } /** * 鏂規硶涓?/span>: 寰楀埌褰撳墠緋葷粺鐨勫ぇ灝忕灞炴?/span> */ int getEndian() { int c = 1; // big-endian: 00 00 00 01 little-endian: 01 00 00 00 // int c = 0x02000001; // big-endian: 02 00 00 01 little-endian: 01 00 00 02 if ((*(char *)&c) == 1) // 鍙?/span>c鍙橀噺鎵鍦ㄥ湴鍧涓婄殑涓涓瓧鑺傘?/span> { printf("little endian/n"); } else printf("big endian"); return 0; } 07騫?2鏈堬紝鎴戝啓浜嗕竴綃囥奀++铏氬嚱鏁拌〃瑙f瀽銆嬬殑鏂囩珷錛屽紩璧蜂簡澶у鐨勫叴瓚c傛湁寰堝鏈嬪弸瀵規垜鐨勬枃绔犵暀浜嗚█錛屾湁榧撳姳鎴戠殑錛屾湁鎵硅瘎鎴戠殑錛岃繕鏈夊緢澶氶棶闂鐨勩傛垜鍦ㄨ繖閲屼竴騫跺澶у鐨勭暀璦琛ㄧず鎰熻阿銆傝繖涔熸槸鎴戜負浠涔堝啀鍐欎竴綃囩畫璦鐨勫師鍥犮傚洜涓猴紝鍦ㄤ笂涓綃囨枃绔犱腑錛屾垜鐢ㄤ簡鐨勭ず渚嬮兘鏄潪甯哥畝鍗曠殑錛屼富瑕佹槸涓轟簡璇存槑涓浜涙満鐞嗕笂鐨勯棶棰橈紝涔熸槸涓轟簡鍥句竴浜涜〃杈句笂鏂逛究鍜岀畝鍗曘備笉鎯籌紝榪欑瘒鏂囩珷鎴愪負浜嗘墦寮C++瀵硅薄妯″瀷鍐呭瓨甯冨眬鐨勪竴涓紩瀛愶紝寮曞彂浜嗗ぇ瀹跺C++瀵硅薄鐨勬洿娣卞眰嬈$殑璁ㄨ銆傚綋鐒訛紝鎴戜箣鍓嶇殑鏂囩珷榪樻湁寰堝鏂歸潰娌℃湁娑夊強錛屼粠鎴戜釜浜烘劅瑙変笅鏉ワ紝鍦ㄨ皥璁鴻櫄鍑芥暟琛ㄩ噷錛岃嚦灝戞湁浠ヤ笅榪欎簺鍐呭娌℃湁娑夊強錛?/p>
1錛夋湁鎴愬憳鍙橀噺鐨勬儏鍐點?/p>
2錛夋湁閲嶅緇ф壙鐨勬儏鍐點?/p>
3錛夋湁铏氭嫙緇ф壙鐨勬儏鍐點?/p>
4錛夋湁閽葷煶鍨嬭櫄鎷熺戶鎵跨殑鎯呭喌銆?/p>
榪欎簺閮芥槸鎴戞湰綃囨枃绔犻渶瑕佸悜澶у璇存槑鐨勪笢瑗褲傛墍浠ワ紝榪欑瘒鏂囩珷灝嗕細鏄奀++铏氬嚱鏁拌〃瑙f瀽銆嬬殑涓涓畫綃囷紝涔熸槸涓綃囬珮綰ц繘闃剁殑鏂囩珷銆傛垜甯屾湜澶у鍦ㄨ榪欑瘒鏂囩珷涔嬪墠瀵笴++鏈変竴瀹氱殑鍩虹鍜屼簡瑙o紝騫惰兘鍏堣鎴戠殑涓婁竴綃囨枃绔犮傚洜涓鴻繖綃囨枃绔犵殑娣卞害鍙兘浼氭瘮杈冩繁錛岃屼笖浼氭瘮杈冩潅涔憋紝鎴戝笇鏈涗綘鍦ㄨ鏈瘒鏂囩珷鏃朵笉浼氭湁澶ц剳鎬濈淮绱婁貢瀵艱嚧澶ц剳姝繪満鐨勬儏鍐點?-) 瀵硅薄鐨勫獎鍝嶅洜绱?/p>
綆鑰岃█涔嬶紝鎴戜滑涓涓被鍙兘浼氭湁濡備笅鐨勫獎鍝嶅洜绱狅細 1錛夋垚鍛樺彉閲?/p>
2錛夎櫄鍑芥暟錛堜駭鐢熻櫄鍑芥暟琛級 3錛夊崟涓緇ф壙錛堝彧緇ф壙浜庝竴涓被錛?/p>
4錛夊閲嶇戶鎵匡紙緇ф壙澶氫釜綾伙級 5錛夐噸澶嶇戶鎵匡紙緇ф壙鐨勫涓埗綾諱腑鍏剁埗綾繪湁鐩稿悓鐨勮秴綾伙級 6錛夎櫄鎷熺戶鎵匡紙浣跨敤virtual鏂瑰紡緇ф壙錛屼負浜嗕繚璇佺戶鎵垮悗鐖剁被鐨勫唴瀛樺竷灞鍙細瀛樺湪涓浠斤級 涓婅堪鐨勪笢瑗塊氬父鏄疌++榪欓棬璇█鍦ㄨ涔夋柟闈㈠瀵硅薄鍐呴儴鐨勫獎鍝嶅洜绱狅紝褰撶劧錛岃繕浼氭湁緙栬瘧鍣ㄧ殑褰卞搷錛堟瘮濡備紭鍖栵級錛岃繕鏈夊瓧鑺傚榻愮殑褰卞搷銆傚湪榪欓噷鎴戜滑閮戒笉璁ㄨ錛屾垜浠彧璁ㄨC++璇█涓婄殑褰卞搷銆?/p>
鏈瘒鏂囩珷鐫閲嶈璁轟笅榪板嚑涓儏鍐典笅鐨凜++瀵硅薄鐨勫唴瀛樺竷灞鎯呭喌銆?/p>
1錛夊崟涓鐨勪竴鑸戶鎵匡紙甯︽垚鍛樺彉閲忋佽櫄鍑芥暟銆佽櫄鍑芥暟瑕嗙洊錛?/p>
2錛夊崟涓鐨勮櫄鎷熺戶鎵匡紙甯︽垚鍛樺彉閲忋佽櫄鍑芥暟銆佽櫄鍑芥暟瑕嗙洊錛?/p>
3錛夊閲嶇戶鎵匡紙甯︽垚鍛樺彉閲忋佽櫄鍑芥暟銆佽櫄鍑芥暟瑕嗙洊錛?/p>
4錛夐噸澶嶅閲嶇戶鎵匡紙甯︽垚鍛樺彉閲忋佽櫄鍑芥暟銆佽櫄鍑芥暟瑕嗙洊錛?/p>
5錛夐捇鐭沖瀷鐨勮櫄鎷熷閲嶇戶鎵匡紙甯︽垚鍛樺彉閲忋佽櫄鍑芥暟銆佽櫄鍑芥暟瑕嗙洊錛?/p>
鎴戜滑鐨勭洰鏍囧氨鏄紝璁╀簨鎯呰秺鏉ヨ秺澶嶆潅銆?/p>
鐭ヨ瘑澶嶄範 鎴戜滑綆鍗曞湴澶嶄範涓涓嬶紝鎴戜滑鍙互閫氳繃瀵硅薄鐨勫湴鍧鏉ュ彇寰楄櫄鍑芥暟琛ㄧ殑鍦板潃錛屽錛?/p>
typedef void(*Fun)(void); Base b; Fun pFun = NULL; cout << "铏氬嚱鏁拌〃鍦板潃錛? << (int*)(&b) << endl; cout << "铏氬嚱鏁拌〃 鈥?絎竴涓嚱鏁板湴鍧錛? << (int*)*(int*)(&b) << endl; // Invoke the first virtual function pFun = (Fun)*((int*)*(int*)(&b)); pFun(); 鎴戜滑鍚屾牱鍙互鐢ㄨ繖縐嶆柟寮忔潵鍙栧緱鏁翠釜瀵硅薄瀹炰緥鐨勫唴瀛樺竷灞銆傚洜涓鴻繖浜涗笢瑗垮湪鍐呭瓨涓兘鏄繛緇垎甯冪殑錛屾垜浠彧闇瑕佷嬌鐢ㄩ傚綋鐨勫湴鍧鍋忕Щ閲忥紝鎴戜滑灝卞彲浠ヨ幏寰楁暣涓唴瀛樺璞$殑甯冨眬銆?/p>
鏈瘒鏂囩珷涓殑渚嬬▼鎴栧唴瀛樺竷灞涓昏浣跨敤濡備笅緙栬瘧鍣ㄥ拰緋葷粺錛?/p>
1錛塛indows XP 鍜?VC++ 2003 2錛塁ygwin 鍜?G++ 3.4.4 鍗曚竴鐨勪竴鑸戶鎵?/strong> 涓嬮潰錛屾垜浠亣璁炬湁濡備笅鎵紺虹殑涓涓戶鎵垮叧緋伙細 璇鋒敞鎰忥紝鍦ㄨ繖涓戶鎵垮叧緋諱腑錛岀埗綾伙紝瀛愮被錛屽瓩瀛愮被閮芥湁鑷繁鐨勪竴涓垚鍛樺彉閲忋傝屼簡綾昏鐩栦簡鐖剁被鐨刦()鏂規硶錛屽瓩瀛愮被瑕嗙洊浜嗗瓙綾葷殑g_child()鍙婂叾瓚呯被鐨刦()銆?/p>
鎴戜滑鐨勬簮紼嬪簭濡備笅鎵紺猴細 class Parent { public: int iparent; Parent ():iparent (10) {} virtual void f() { cout << " Parent::f()" << endl; } virtual void g() { cout << " Parent::g()" << endl; } virtual void h() { cout << " Parent::h()" << endl; } }; class Child : public Parent { public: int ichild; Child():ichild(100) {} virtual void f() { cout << "Child::f()" << endl; } virtual void g_child() { cout << "Child::g_child()" << endl; } virtual void h_child() { cout << "Child::h_child()" << endl; } }; class GrandChild : public Child{ public: int igrandchild; GrandChild():igrandchild(1000) {} virtual void f() { cout << "GrandChild::f()" << endl; } virtual void g_child() { cout << "GrandChild::g_child()" << endl; } virtual void h_grandchild() { cout << "GrandChild::h_grandchild()" << endl; } }; 鎴戜滑浣跨敤浠ヤ笅紼嬪簭浣滀負嫻嬭瘯紼嬪簭錛氾紙涓嬮潰紼嬪簭涓紝鎴戜嬌鐢ㄤ簡涓涓猧nt** pVtab 鏉ヤ綔涓洪亶鍘嗗璞″唴瀛樺竷灞鐨勬寚閽堬紝榪欐牱錛屾垜灝卞彲浠ユ柟渚垮湴鍍忎嬌鐢ㄦ暟緇勪竴鏍鋒潵閬嶅巻鎵鏈夌殑鎴愬憳鍖呮嫭鍏惰櫄鍑芥暟琛ㄤ簡錛屽湪鍚庨潰鐨勭▼搴忎腑錛屾垜涔熸槸鐢ㄨ繖鏍風殑鏂規硶鐨勶紝璇蜂笉蹇呮劅鍒板鎬紝錛?/p>
typedef void(*Fun)(void); GrandChild gc; int** pVtab = (int**)&gc; cout << "[0] GrandChild::_vptr->" << endl; for (int i=0; (Fun)pVtab[0][i]!=NULL; i++){ pFun = (Fun)pVtab[0][i]; cout << " ["<<i<<"] "; pFun(); } cout << "[1] Parent.iparent = " << (int)pVtab[1] << endl; cout << "[2] Child.ichild = " << (int)pVtab[2] << endl; cout << "[3] GrandChild.igrandchild = " << (int)pVtab[3] << endl; 鍏惰繍琛岀粨鏋滃涓嬫墍紺猴細錛堝湪VC++ 2003鍜孏++ 3.4.4涓嬶級 [0] GrandChild::_vptr-> [0] GrandChild::f() [1] Parent::g() [2] Parent::h() [3] GrandChild::g_child() [4] Child::h1() [5] GrandChild::h_grandchild() [1] Parent.iparent = 10 [2] Child.ichild = 100 [3] GrandChild.igrandchild = 1000 浣跨敤鍥劇墖琛ㄧず濡備笅錛?/p>
鍙浠ヤ笅鍑犱釜鏂歸潰錛?/p>
1錛夎櫄鍑芥暟琛ㄥ湪鏈鍓嶉潰鐨勪綅緗?/p>
2錛夋垚鍛樺彉閲忔牴鎹叾緇ф壙鍜屽0鏄庨『搴忎緷嬈℃斁鍦ㄥ悗闈€?/p>
3錛夊湪鍗曚竴鐨勭戶鎵夸腑錛岃overwrite鐨勮櫄鍑芥暟鍦ㄨ櫄鍑芥暟琛ㄤ腑寰楀埌浜嗘洿鏂般?/p>
澶氶噸緇ф壙 涓嬮潰錛屽啀璁╂垜浠潵鐪嬬湅澶氶噸緇ф壙涓殑鎯呭喌錛屽亣璁炬湁涓嬮潰榪欐牱涓涓被鐨勭戶鎵垮叧緋匯傛敞鎰忥細瀛愮被鍙猳verwrite浜嗙埗綾葷殑f()鍑芥暟錛岃岃繕鏈変竴涓槸鑷繁鐨勫嚱鏁幫紙鎴戜滑榪欐牱鍋氱殑鐩殑鏄負浜嗙敤g1()浣滀負涓涓爣璁版潵鏍囨槑瀛愮被鐨勮櫄鍑芥暟琛級銆傝屼笖姣忎釜綾諱腑閮芥湁涓涓嚜宸辯殑鎴愬憳鍙橀噺錛?/p>
鎴戜滑鐨勭被緇ф壙鐨勬簮浠g爜濡備笅鎵紺猴細鐖剁被鐨勬垚鍛樺垵濮嬩負10錛?0錛?0錛屽瓙綾葷殑涓?00 class Base1 { public: int ibase1; Base1():ibase1(10) {} virtual void f() { cout << "Base1::f()" << endl; } virtual void g() { cout << "Base1::g()" << endl; } virtual void h() { cout << "Base1::h()" << endl; } }; class Base2 { public: int ibase2; Base2():ibase2(20) {} virtual void f() { cout << "Base2::f()" << endl; } virtual void g() { cout << "Base2::g()" << endl; } virtual void h() { cout << "Base2::h()" << endl; } }; class Base3 { public: int ibase3; Base3():ibase3(30) {} virtual void f() { cout << "Base3::f()" << endl; } virtual void g() { cout << "Base3::g()" << endl; } virtual void h() { cout << "Base3::h()" << endl; } }; class Derive : public Base1, public Base2, public Base3 { public: int iderive; Derive():iderive(100) {} virtual void f() { cout << "Derive::f()" << endl; } virtual void g1() { cout << "Derive::g1()" << endl; } }; 鎴戜滑閫氳繃涓嬮潰鐨勭▼搴忔潵鏌ョ湅瀛愮被瀹炰緥鐨勫唴瀛樺竷灞錛氫笅闈㈢▼搴忎腑錛屾敞鎰忔垜浣跨敤浜嗕竴涓猻鍙橀噺錛屽叾涓敤鍒頒簡sizof(Base)鏉ユ壘涓嬩竴涓被鐨勫亸縐婚噺銆傦紙鍥犱負鎴戝0鏄庣殑鏄痠nt鎴愬憳錛屾墍浠ユ槸4涓瓧鑺傦紝鎵浠ユ病鏈夊榻愰棶棰樸傚叧浜庡唴瀛樼殑瀵歸綈闂錛屽ぇ瀹跺彲浠ヨ嚜琛岃瘯楠岋紝鎴戝湪榪欓噷灝變笉澶氳浜嗭級 typedef void(*Fun)(void); Derive d; int** pVtab = (int**)&d; cout << "[0] Base1::_vptr->" << endl; pFun = (Fun)pVtab[0][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[0][1]; cout << " [1] ";pFun(); pFun = (Fun)pVtab[0][2]; cout << " [2] ";pFun(); pFun = (Fun)pVtab[0][3]; cout << " [3] "; pFun(); pFun = (Fun)pVtab[0][4]; cout << " [4] "; cout<<pFun<<endl; cout << "[1] Base1.ibase1 = " << (int)pVtab[1] << endl; int s = sizeof(Base1)/4; cout << "[" << s << "] Base2::_vptr->"<<endl; pFun = (Fun)pVtab[s][0]; cout << " [0] "; pFun(); Fun = (Fun)pVtab[s][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[s][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[s][3]; out << " [3] "; cout<<pFun<<endl; cout << "["<< s+1 <<"] Base2.ibase2 = " << (int)pVtab[s+1] << endl; s = s + sizeof(Base2)/4; cout << "[" << s << "] Base3::_vptr->"<<endl; pFun = (Fun)pVtab[s][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[s][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[s][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[s][3]; cout << " [3] "; cout<<pFun<<endl; s++; cout << "["<< s <<"] Base3.ibase3 = " << (int)pVtab[s] << endl; s++; cout << "["<< s <<"] Derive.iderive = " << (int)pVtab[s] << endl; 鍏惰繍琛岀粨鏋滃涓嬫墍紺猴細錛堝湪VC++ 2003鍜孏++ 3.4.4涓嬶級 [0] Base1::_vptr-> [0] Derive::f() [1] Base1::g() [2] Base1::h() [3] Driver::g1() [4] 00000000 ç 娉ㄦ剰錛氬湪GCC涓嬶紝榪欓噷鏄?/span>1 [1] Base1.ibase1 = 10 [2] Base2::_vptr-> [0] Derive::f() [1] Base2::g() [2] Base2::h() [3] 00000000 ç 娉ㄦ剰錛氬湪GCC涓嬶紝榪欓噷鏄?/span>1 [3] Base2.ibase2 = 20 [4] Base3::_vptr-> [0] Derive::f() [1] Base3::g() [2] Base3::h() [3] 00000000 [5] Base3.ibase3 = 30 [6] Derive.iderive = 100 浣跨敤鍥劇墖琛ㄧず鏄笅闈㈣繖涓牱瀛愶細 鎴戜滑鍙互鐪嬪埌錛?/p>
1錛?姣忎釜鐖剁被閮芥湁鑷繁鐨勮櫄琛ㄣ?/p>
2錛?瀛愮被鐨勬垚鍛樺嚱鏁拌鏀懼埌浜嗙涓涓埗綾葷殑琛ㄤ腑銆?/p>
3錛?鍐呭瓨甯冨眬涓紝鍏剁埗綾誨竷灞渚濇鎸夊0鏄庨『搴忔帓鍒椼?/p>
4錛?姣忎釜鐖剁被鐨勮櫄琛ㄤ腑鐨刦()鍑芥暟閮借overwrite鎴愪簡瀛愮被鐨刦()銆傝繖鏍峰仛灝辨槸涓轟簡瑙e喅涓嶅悓鐨勭埗綾葷被鍨嬬殑鎸囬拡鎸囧悜鍚屼竴涓瓙綾誨疄渚嬶紝鑰岃兘澶熻皟鐢ㄥ埌瀹為檯鐨勫嚱鏁般?/p>
閲嶅緇ф壙 涓嬮潰鎴戜滑鍐嶆潵鐪嬬湅錛屽彂鐢熼噸澶嶇戶鎵跨殑鎯呭喌銆傛墍璋撻噸澶嶇戶鎵匡紝涔熷氨鏄煇涓熀綾昏闂存帴鍦伴噸澶嶇戶鎵夸簡澶氭銆?/p>
涓嬪浘鏄竴涓戶鎵垮浘錛屾垜浠噸杞戒簡鐖剁被鐨刦()鍑芥暟銆?/p>
鍏剁被緇ф壙鐨勬簮浠g爜濡備笅鎵紺恒傚叾涓紝姣忎釜綾婚兘鏈変袱涓彉閲忥紝涓涓槸鏁村艦錛?瀛楄妭錛夛紝涓涓槸瀛楃錛?瀛楄妭錛夛紝鑰屼笖榪樻湁鑷繁鐨勮櫄鍑芥暟錛岃嚜宸眔verwrite鐖剁被鐨勮櫄鍑芥暟銆傚瀛愮被D涓紝f()瑕嗙洊浜嗚秴綾葷殑鍑芥暟錛?f1() 鍜宖2() 瑕嗙洊浜嗗叾鐖剁被鐨勮櫄鍑芥暟錛孌f()涓鴻嚜宸辯殑铏氬嚱鏁般?/p>
class B { public: int ib; char cb; public: B():ib(0),cb('B') {} virtual void f() { cout << "B::f()" << endl;} virtual void Bf() { cout << "B::Bf()" << endl;} }; class B1 : public B { public: int ib1; char cb1; public: B1():ib1(11),cb1('1') {} virtual void f() { cout << "B1::f()" << endl;} virtual void f1() { cout << "B1::f1()" << endl;} virtual void Bf1() { cout << "B1::Bf1()" << endl;} }; class B2: public B { public: int ib2; char cb2; public: B2():ib2(12),cb2('2') {} virtual void f() { cout << "B2::f()" << endl;} virtual void f2() { cout << "B2::f2()" << endl;} virtual void Bf2() { cout << "B2::Bf2()" << endl;} }; class D : public B1, public B2 { public: int id; char cd; public: D():id(100),cd('D') {} virtual void f() { cout << "D::f()" << endl;} virtual void f1() { cout << "D::f1()" << endl;} virtual void f2() { cout << "D::f2()" << endl;} virtual void Df() { cout << "D::Df()" << endl;} }; 鎴戜滑鐢ㄦ潵瀛樺彇瀛愮被鍐呭瓨甯冨眬鐨勪唬鐮佸涓嬫墍紺猴細錛堝湪VC++ 2003鍜孏++ 3.4.4涓嬶級 typedef void(*Fun)(void); int** pVtab = NULL; Fun pFun = NULL; D d; pVtab = (int**)&d; cout << "[0] D::B1::_vptr->" << endl; pFun = (Fun)pVtab[0][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[0][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[0][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[0][3]; cout << " [3] "; pFun(); pFun = (Fun)pVtab[0][4]; cout << " [4] "; pFun(); pFun = (Fun)pVtab[0][5]; cout << " [5] 0x" << pFun << endl; cout << "[1] B::ib = " << (int)pVtab[1] << endl; cout << "[2] B::cb = " << (char)pVtab[2] << endl; cout << "[3] B1::ib1 = " << (int)pVtab[3] << endl; cout << "[4] B1::cb1 = " << (char)pVtab[4] << endl; cout << "[5] D::B2::_vptr->" << endl; pFun = (Fun)pVtab[5][0]; cout << " [0] "; pFun(); pFun = (Fun)pVtab[5][1]; cout << " [1] "; pFun(); pFun = (Fun)pVtab[5][2]; cout << " [2] "; pFun(); pFun = (Fun)pVtab[5][3]; cout << " [3] "; pFun(); pFun = (Fun)pVtab[5][4]; cout << " [4] 0x" << pFun << endl; cout << "[6] B::ib = " << (int)pVtab[6] << endl; cout << "[7] B::cb = " << (char)pVtab[7] << endl; cout << "[8] B2::ib2 = " << (int)pVtab[8] << endl; cout << "[9] B2::cb2 = " << (char)pVtab[9] << endl; cout << "[10] D::id = " << (int)pVtab[10] << endl; cout << "[11] D::cd = " << (char)pVtab[11] << endl; 紼嬪簭榪愯緇撴灉濡備笅錛?/p>
GCC 3.4.4 VC++ 2003 [0] D::B1::_vptr-> [0] D::f() [1] B::Bf() [2] D::f1() [3] B1::Bf1() [4] D::f2() [5] 0x1 [1] B::ib = 0 [2] B::cb = B [3] B1::ib1 = 11 [4] B1::cb1 = 1 [5] D::B2::_vptr-> [0] D::f() [1] B::Bf() [2] D::f2() [3] B2::Bf2() [4] 0x0 [6] B::ib = 0 [7] B::cb = B [8] B2::ib2 = 12 [9] B2::cb2 = 2 [10] D::id = 100 [11] D::cd = D [0] D::B1::_vptr-> [0] D::f() [1] B::Bf() [2] D::f1() [3] B1::Bf1() [4] D::Df() [5] 0x00000000 [1] B::ib = 0 [2] B::cb = B [3] B1::ib1 = 11 [4] B1::cb1 = 1 [5] D::B2::_vptr-> [0] D::f() [1] B::Bf() [2] D::f2() [3] B2::Bf2() [4] 0x00000000 [6] B::ib = 0 [7] B::cb = B [8] B2::ib2 = 12 [9] B2::cb2 = 2 [10] D::id = 100 [11] D::cd = D 涓嬮潰鏄浜庡瓙綾誨疄渚嬩腑鐨勮櫄鍑芥暟琛ㄧ殑鍥撅細 鎴戜滑鍙互鐪嬭錛屾渶欏剁鐨勭埗綾籅鍏舵垚鍛樺彉閲忓瓨鍦ㄤ簬B1鍜孊2涓紝騫惰D緇欑戶鎵夸笅鍘諱簡銆傝屽湪D涓紝鍏舵湁B1鍜孊2鐨勫疄渚嬶紝浜庢槸B鐨勬垚鍛樺湪D鐨勫疄渚嬩腑瀛樺湪涓や喚錛屼竴浠芥槸B1緇ф壙鑰屾潵鐨勶紝鍙︿竴浠芥槸B2緇ф壙鑰屾潵鐨勩傛墍浠ワ紝濡傛灉鎴戜滑浣跨敤浠ヤ笅璇彞錛屽垯浼氫駭鐢熶簩涔夋х紪璇戦敊璇細 D d; d.ib = 0; //浜屼箟鎬ч敊璇?/p>
d.B1::ib = 1; //姝g‘ d.B2::ib = 2; //姝g‘ 娉ㄦ剰錛屼笂闈緥紼嬩腑鐨勬渶鍚庝袱鏉¤鍙ュ瓨鍙栫殑鏄袱涓彉閲忋傝櫧鐒舵垜浠秷闄や簡浜屼箟鎬х殑緙栬瘧閿欒錛屼絾B綾誨湪D涓繕鏄湁涓や釜瀹炰緥錛岃繖縐嶇戶鎵塊犳垚浜嗘暟鎹殑閲嶅錛屾垜浠彨榪欑緇ф壙涓洪噸澶嶇戶鎵褲傞噸澶嶇殑鍩虹被鏁版嵁鎴愬憳鍙兘騫朵笉鏄垜浠兂瑕佺殑銆傛墍浠ワ紝C++寮曞叆浜嗚櫄鍩虹被鐨勬蹇點?/p>
閽葷煶鍨嬪閲嶈櫄鎷熺戶鎵?/strong> 铏氭嫙緇ф壙鐨勫嚭鐜板氨鏄負浜嗚В鍐抽噸澶嶇戶鎵夸腑澶氫釜闂存帴鐖剁被鐨勯棶棰樼殑銆傞捇鐭沖瀷鐨勭粨鏋勬槸鍏舵渶緇忓吀鐨勭粨鏋勩備篃鏄垜浠湪榪欓噷瑕佽璁虹殑緇撴瀯錛?/p>
涓婅堪鐨?#8220;閲嶅緇ф壙”鍙渶瑕佹妸B1鍜孊2緇ф壙B鐨勮娉曚腑鍔犱笂virtual 鍏抽敭錛屽氨鎴愪簡铏氭嫙緇ф壙錛屽叾緇ф壙鍥懼涓嬫墍紺猴細 涓婂浘鍜屽墠闈㈢殑“閲嶅緇ф壙”涓殑綾葷殑鍐呴儴鏁版嵁鍜屾帴鍙i兘鏄畬鍏ㄤ竴鏍風殑錛屽彧鏄垜浠噰鐢ㄤ簡铏氭嫙緇ф壙錛氬叾鐪佺暐鍚庣殑婧愮爜濡備笅鎵紺猴細 class B {……}; class B1 : virtual public B{……}; class B2: virtual public B{……}; class D : public B1, public B2{ …… }; 鍦ㄦ煡鐪婦涔嬪墠錛屾垜浠厛鐪嬩竴鐪嬪崟涓铏氭嫙緇ф壙鐨勬儏鍐點備笅闈㈡槸涓孌靛湪VC++2003涓嬬殑嫻嬭瘯紼嬪簭錛氾紙鍥犱負VC++鍜孏CC鐨勫唴瀛樿屽眬涓婃湁涓浜涚粏鑺備笂鐨勪笉鍚岋紝鎵浠ヨ繖閲屽彧緇欏嚭VC++鐨勭▼搴忥紝GCC涓嬬殑紼嬪簭澶у鍙互鏍規嵁鎴戠粰鍑虹殑紼嬪簭鑷繁浠跨収鐫鍐欎竴涓幓璇曚竴璇曪級錛?/p>
int** pVtab = NULL; Fun pFun = NULL; B1 bb1; pVtab = (int**)&bb1; cout << "[0] B1::_vptr->" << endl; pFun = (Fun)pVtab[0][0]; cout << " [0] "; pFun(); //B1::f1(); cout << " [1] "; pFun = (Fun)pVtab[0][1]; pFun(); //B1::bf1(); cout << " [2] "; cout << pVtab[0][2] << endl; cout << "[1] = 0x"; cout << (int*)*((int*)(&bb1)+1) <<endl; //B1::ib1 cout << "[2] B1::ib1 = "; cout << (int)*((int*)(&bb1)+2) <<endl; //B1::ib1 cout << "[3] B1::cb1 = "; cout << (char)*((int*)(&bb1)+3) << endl; //B1::cb1 cout << "[4] = 0x"; cout << (int*)*((int*)(&bb1)+4) << endl; //NULL cout << "[5] B::_vptr->" << endl; pFun = (Fun)pVtab[5][0]; cout << " [0] "; pFun(); //B1::f(); pFun = (Fun)pVtab[5][1]; cout << " [1] "; pFun(); //B::Bf(); cout << " [2] "; cout << "0x" << (Fun)pVtab[5][2] << endl; cout << "[6] B::ib = "; cout << (int)*((int*)(&bb1)+6) <<endl; //B::ib cout << "[7] B::cb = "; 鍏惰繍琛岀粨鏋滃涓嬶紙鎴戠粨鍑轟簡GCC鐨勫拰VC++2003鐨勫姣旓級錛?/p>
GCC 3.4.4 VC++ 2003 [0] B1::_vptr -> [0] : B1::f() [1] : B1::f1() [2] : B1::Bf1() [3] : 0 [1] B1::ib1 : 11 [2] B1::cb1 : 1 [3] B::_vptr -> [0] : B1::f() [1] : B::Bf() [2] : 0 [4] B::ib : 0 [5] B::cb : B [6] NULL : 0 [0] B1::_vptr-> [0] B1::f1() [1] B1::Bf1() [2] 0 [1] = 0x00454310 ç璇ュ湴鍧鍙栧煎悗鏄?/span>-4 [2] B1::ib1 = 11 [3] B1::cb1 = 1 [4] = 0x00000000 [5] B::_vptr-> [0] B1::f() [1] B::Bf() [2] 0x00000000 [6] B::ib = 0 [7] B::cb = B 榪欓噷錛屽ぇ瀹跺彲浠ヨ嚜宸卞姣斾竴涓嬨傚叧浜庣粏鑺備笂錛屾垜浼氬湪鍚庨潰涓騫跺啀璇淬?/p>
涓嬮潰鐨勬祴璇曠▼搴忔槸鐪嬪瓙綾籇鐨勫唴瀛樺竷灞錛屽悓鏍鋒槸VC++ 2003鐨勶紙鍥犱負VC++鍜孏CC鐨勫唴瀛樺竷灞涓婃湁涓浜涚粏鑺備笂鐨勪笉鍚岋紝鑰孷C++鐨勭浉瀵硅娓呮寰堝錛屾墍浠ヨ繖閲屽彧緇欏嚭VC++鐨勭▼搴忥紝GCC涓嬬殑紼嬪簭澶у鍙互鏍規嵁鎴戠粰鍑虹殑紼嬪簭鑷繁浠跨収鐫鍐欎竴涓幓璇曚竴璇曪級錛?/p>
D d; pVtab = (int**)&d; cout << "[0] D::B1::_vptr->" << endl; pFun = (Fun)pVtab[0][0]; cout << " [0] "; pFun(); //D::f1(); pFun = (Fun)pVtab[0][1]; cout << " [1] "; pFun(); //B1::Bf1(); pFun = (Fun)pVtab[0][2]; cout << " [2] "; pFun(); //D::Df(); pFun = (Fun)pVtab[0][3]; cout << " [3] "; cout << pFun << endl; //cout << pVtab[4][2] << endl; cout << "[1] = 0x"; cout << (int*)((&dd)+1) <<endl; //???? cout << "[2] B1::ib1 = "; cout << *((int*)(&dd)+2) <<endl; //B1::ib1 cout << "[3] B1::cb1 = "; cout << (char)*((int*)(&dd)+3) << endl; //B1::cb1 //--------------------- cout << "[4] D::B2::_vptr->" << endl; pFun = (Fun)pVtab[4][0]; cout << " [0] "; pFun(); //D::f2(); pFun = (Fun)pVtab[4][1]; cout << " [1] "; pFun(); //B2::Bf2(); pFun = (Fun)pVtab[4][2]; cout << " [2] "; cout << pFun << endl; cout << "[5] = 0x"; cout << *((int*)(&dd)+5) << endl; // ??? cout << "[6] B2::ib2 = "; cout << (int)*((int*)(&dd)+6) <<endl; //B2::ib2 cout << "[7] B2::cb2 = "; cout << (char)*((int*)(&dd)+7) << endl; //B2::cb2 cout << "[8] D::id = "; cout << *((int*)(&dd)+8) << endl; //D::id cout << "[9] D::cd = "; cout << (char)*((int*)(&dd)+9) << endl;//D::cd cout << "[10] = 0x"; cout << (int*)*((int*)(&dd)+10) << endl; //--------------------- cout << "[11] D::B::_vptr->" << endl; pFun = (Fun)pVtab[11][0]; cout << " [0] "; pFun(); //D::f(); pFun = (Fun)pVtab[11][1]; cout << " [1] "; pFun(); //B::Bf(); pFun = (Fun)pVtab[11][2]; cout << " [2] "; cout << pFun << endl; cout << "[12] B::ib = "; cout << *((int*)(&dd)+12) << endl; //B::ib cout << "[13] B::cb = "; cout << (char)*((int*)(&dd)+13) <<endl;//B::cb 涓嬮潰緇欏嚭榪愯鍚庣殑緇撴灉錛堝垎VC++鍜孏CC涓ら儴浠斤級 GCC 3.4.4 VC++ 2003 [0] B1::_vptr -> [0] : D::f() [1] : D::f1() [2] : B1::Bf1() [3] : D::f2() [4] : D::Df() [5] : 1 [1] B1::ib1 : 11 [2] B1::cb1 : 1 [3] B2::_vptr -> [0] : D::f() [1] : D::f2() [2] : B2::Bf2() [3] : 0 [4] B2::ib2 : 12 [5] B2::cb2 : 2 [6] D::id : 100 [7] D::cd : D [8] B::_vptr -> [0] : D::f() [1] : B::Bf() [2] : 0 [9] B::ib : 0 [10] B::cb : B [11] NULL : 0 [0] D::B1::_vptr-> [0] D::f1() [1] B1::Bf1() [2] D::Df() [3] 00000000 [1] = 0x0013FDC4 ç 璇ュ湴鍧鍙栧煎悗鏄?/span>-4 [2] B1::ib1 = 11 [3] B1::cb1 = 1 [4] D::B2::_vptr-> [0] D::f2() [1] B2::Bf2() [2] 00000000 [5] = 0x4539260 ç 璇ュ湴鍧鍙栧煎悗鏄?/span>-4 [6] B2::ib2 = 12 [7] B2::cb2 = 2 [8] D::id = 100 [9] D::cd = D [10] = 0x00000000 [11] D::B::_vptr-> [0] D::f() [1] B::Bf() [2] 00000000 [12] B::ib = 0 [13] B::cb = B 鍏充簬铏氭嫙緇ф壙鐨勮繍琛岀粨鏋滄垜灝變笉鐢誨浘浜嗭紙鍓嶉潰鐨勪綔鍥懼凡緇忚鎴戜駭鐢熶簡寰堜弗閲嶇殑鍘屽︽劅錛屾墍浠ュ氨鍋蜂釜鎳掍簡錛屽ぇ瀹惰璋呬簡錛?/p>
鍦ㄤ笂闈㈢殑杈撳嚭緇撴灉涓紝鎴戠敤涓嶅悓鐨勯鑹插仛浜嗕竴浜涙爣鏄庛傛垜浠彲浠ョ湅鍒板涓嬬殑鍑犵偣錛?/p>
1錛夋棤璁烘槸GCC榪樻槸VC++錛岄櫎浜嗕竴浜涚粏鑺備笂鐨勪笉鍚岋紝鍏跺ぇ浣撲笂鐨勫璞″竷灞鏄竴鏍風殑銆備篃灝辨槸璇達紝鍏堟槸B1錛堥粍鑹詫級錛岀劧鍚庢槸B2錛堢豢鑹詫級錛屾帴鐫鏄疍錛堢伆鑹詫級錛岃孊榪欎釜瓚呯被錛堥潚钃濊壊錛夌殑瀹炰緥閮芥斁鍦ㄦ渶鍚庣殑浣嶇疆銆?/p>
2錛夊叧浜庤櫄鍑芥暟琛紝灝ゅ叾鏄涓涓櫄琛紝GCC鍜孷C++鏈夊緢閲嶅ぇ鐨勪笉涓鏍楓備絾浠旂粏鐪嬩笅鏉ワ紝榪樻槸VC++鐨勮櫄琛ㄦ瘮杈冩竻鏅板拰鏈夐昏緫鎬с?/p>
3錛塚C++鍜孏CC閮芥妸B榪欎釜瓚呯被鏀懼埌浜嗘渶鍚庯紝鑰孷C++鏈変竴涓狽ULL鍒嗛殧絎︽妸B鍜孊1鍜孊2鐨勫竷灞鍒嗗紑銆侴CC鍒欐病鏈夈?/p>
4錛塚C++涓殑鍐呭瓨甯冨眬鏈変袱涓湴鍧鎴戞湁浜涗笉鏄緢鏄庣櫧錛屽湪鍏朵腑鎴戠敤綰㈣壊鏍囧嚭浜嗐傚彇鍏跺唴瀹規槸-4銆傛帴閬撶悊鏉ヨ錛岃繖涓寚閽堝簲璇ユ槸鎸囧悜B綾誨疄渚嬬殑鍐呭瓨鍦板潃錛堣繖涓仛娉曞氨鏄負浜嗕繚璇侀噸澶嶇殑鐖剁被鍙湁涓涓疄渚嬬殑鎶鏈級銆備絾鍙栧煎悗鍗翠笉鏄傝繖鐐規垜鐩墠榪樺茍涓嶅お娓呮錛岃繕鍚戝ぇ瀹惰鏁欍?/p>
5錛塆CC鐨勫唴瀛樺竷灞涓湪B1鍜孊2涓垯娌℃湁鎸囧悜B鐨勬寚閽堛傝繖鐐瑰彲浠ョ悊瑙o紝緙栬瘧鍣ㄥ彲浠ラ氳繃璁$畻B1鍜孊2鐨剆ize鑰屽緱鍑築鐨勫亸縐婚噺銆?/p>
緇撴潫璇?/strong> C++榪欓棬璇█鏄竴闂ㄦ瘮杈冨鏉傜殑璇█錛屽浜庣▼搴忓憳鏉ヨ錛屾垜浠技涔庢案榪滄懜涓嶆竻妤氳繖闂ㄨ璦鑳岀潃鎴戜滑鍦ㄥ共浜嗕粈涔堛傞渶瑕佺啛鎮夎繖闂ㄨ璦錛屾垜浠氨蹇呴渶瑕佷簡瑙++閲岄潰鐨勯偅浜涗笢瑗匡紝闇瑕佹垜浠幓浜嗚В浠栧悗闈㈢殑鍐呭瓨瀵硅薄銆傝繖鏍鋒垜浠墠鑳界湡姝g殑浜嗚ВC++錛屼粠鑰岃兘澶熸洿濂界殑浣跨敤C++榪欓棬鏈闅劇殑緙栫▼璇█銆?/p>
鍦ㄦ枃绔犳潫涔嬪墠榪樻槸浠嬬粛涓涓嬭嚜宸卞惂銆傛垜浠庝簨杞歡鐮斿彂鏈夊崄涓勾澶翠簡錛岀洰鍓嶆槸杞歡寮鍙戞妧鏈富綆★紝鎶鏈柟闈紝涓繪敾Unix/C/C++錛屾瘮杈冨枩嬈㈢綉緇滀笂鐨勬妧鏈紝姣斿鍒嗗竷寮忚綆楋紝緗戞牸璁$畻錛孭2P錛孉jax絳変竴鍒囧拰浜掕仈緗戠浉鍏崇殑涓滆タ銆傜鐞嗘柟闈㈡瘮杈冩搮闀夸簬鍥㈤槦寤鴻錛屾妧鏈秼鍔垮垎鏋愶紝欏圭洰綆$悊銆傛榪庡ぇ瀹跺拰鎴戜氦嫻侊紝鎴戠殑MSN鍜孍mail鏄細haoel@hotmail.com
]]>
]]>Lambda 琛ㄨ揪寮?/h4>
[capture](parameters)->return_type {body}
int main(){ char s[]="Hello World!"; int Uppercase = 0; //modified by the lambda for_each(s, s+sizeof(s), [&Uppercase] (char c) { if (isupper(c)) Uppercase++; }); cout << Uppercase << " uppercase letters in: " << s <<endl;}
template <class T>class less{public: bool operator()(const T&l, const T&r)const { return l < r; }};鑷姩綾誨瀷鎺ㄥ auto
auto x=0; //x has type int because 0 is intauto c='a'; //charauto d=0.5; //doubleauto national_debt=14400000000000LL;//long long
vector<int>::const_iterator ci = vi.begin();
auto ci = vi.begin();
auto obj = ProcessData(someVariables);
auto pObject = new SomeType<OtherType>::SomeOtherType();鑷姩鍖栨帹瀵?decltype
decltype 鏄竴涓搷浣滅錛屽叾鍙互璇勪及鎷彿鍐呰〃杈懼紡鐨勭被鍨嬶紝鍏惰鍒欏涓嬶細
const vector<int> vi;typedef decltype (vi.begin()) CIT;CIT another_const_iterator;
decltype(&myfunc) pfunc = 0;typedef decltype(&A::func1) type;auto 鍜?decltype 鐨勫樊鍒拰鍏崇郴
#include <vector>int main(){ const std::vector<int> v(1); auto a = v[0]; // a 鐨勭被鍨嬫槸 int decltype(v[0]) b = 1; // b 鐨勭被鍨嬫槸 const int&, 鍥犱負鍑芥暟鐨勮繑鍥炵被鍨嬫槸 // std::vector<int>::operator[](size_type) const auto c = 0; // c 鐨勭被鍨嬫槸 int auto d = c; // d 鐨勭被鍨嬫槸 int decltype(c) e; // e 鐨勭被鍨嬫槸 int, 鍥犱負 c 鐨勭被鍨嬫槸int decltype((c)) f = c; // f 鐨勭被鍨嬫槸 int&, 鍥犱負 (c) 鏄乏鍊?/code> decltype(0) g; // g 鐨勭被鍨嬫槸 int, 鍥犱負 0 鏄彸鍊?/code>}
template< typename LHS, typename RHS> auto AddingFunc(const LHS &lhs, const RHS &rhs) -> decltype(lhs+rhs){return lhs + rhs;}緇熶竴鐨勫垵濮嬪寲璇硶
int arr[4]={0,1,2,3};struct tm today={0};
struct A { int m; }; // PODstruct B { ~B(); int m; }; // non-POD, compiler generated default ctorstruct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
C c {0,0}; //C++11 only. 鐩稿綋浜? C c(0,0);int* a = new int[3] { 1, 2, 0 }; /C++11 onlyclass X { int a[4]; public: X() : a{1,2,3,4} {} //C++11, member array initializer};
// C++11 container initializervector<string> vs={ "first", "second", "third"};map singers ={ {"Lady Gaga", "+1 (212) 555-7890"},{"Beyonce Knowles", "+1 (212) 555-0987"}};
class C{ int a=7; //C++11 only public: C();};Delete 鍜?Default 鍑芥暟
struct A{ A()=default; //C++11 virtual ~A()=default; //C++11};
struct NoCopy{ NoCopy & operator =( const NoCopy & ) = delete; NoCopy ( const NoCopy & ) = delete;};NoCopy a;NoCopy b(a); //compilation error, copy ctor is deleted
struct SomeType{ SomeType() = default; // 浣跨敤緙栬瘧鍣ㄧ敓鎴愮殑榛樿鏋勯犲嚱鏁?/code> SomeType(OtherType value);};
struct NonNewable { void *operator new(std::size_t) = delete;};f()錛屽皢浼氬紩鍙戠紪璇戞湡閿欒錛?緙栬瘧鍣ㄤ笉浼氳嚜鍔ㄥ皢 double 褰㈠弬杞瀷涓?int 鍐嶈皟鐢?code>f()錛屽鏋滀紶鍏ョ殑鍙傛暟鏄痙ouble錛屽垯浼氬嚭鐜扮紪璇戦敊璇級
void f(int i); void f(double) = delete;nullptr
nullptr 鐨勫師鍥犮?nbsp;nullptr 鏄己綾誨瀷鐨勩?/p>
void f(int); //#1void f(char *);//#2//C++03f(0); //浜屼箟鎬?/code>//C++11f(nullptr) //鏃犱簩涔夋э紝璋冪敤f(char*)鎵浠ュ湪鏂扮増涓浠?nullptr 鍒濆鍖栨寚閽堛?/p>
濮旀墭鏋勯?/h4>
class SomeType {private: int number; string name; SomeType( int i, string& s ) : number(i), name(s){}public: SomeType( ) : SomeType( 0, "invalid" ){} SomeType( int i ) : SomeType( i, "guest" ){} SomeType( string& s ) : SomeType( 1, s ){ PostInit(); }};
class BaseClass{public: BaseClass(int iValue);};class DerivedClass : public BaseClass{public: using BaseClass::BaseClass;};鍙沖煎紩鐢ㄥ拰move璇箟
void naiveswap(string &a, string &b){ string temp = a; a=b; b=temp;}
class string{ string (string&&); //move constructor string&& operator=(string&&); //move assignment operator};C++ 11 STL 鏍囧噯搴?/h4>
unordered_set, unordered_map, unordered_multiset, 鍜?nbsp;unordered_multimap) 浠ュ強涓浜涙柊鐨勫簱鏀寔璇稿錛氭鍒欒〃杈懼紡錛?tuples錛屽嚱鏁板璞″寘瑁咃紝絳夌瓑銆?C++11 鎵瑰噯浜?TR1 鎴愪負姝e紡鐨凜++鏍囧噯錛岃繕鏈変竴浜汿R1 鍚庢柊鍔犵殑涓浜涘簱錛屼粠鑰屾垚涓轟簡鏂扮殑C++ 11 STL鏍囧噯搴撱傝繖涓簱涓昏鍖呭惈涓嬮潰鐨勫姛鑳斤細綰跨▼搴?/h5>
鏂板瀷鏅鴻兘鎸囬拡
auto_ptr錛?鍦–++ 11涓搴熷純浜嗐?/code>C++11 寮曞叆浜嗕袱涓寚閽堢被錛?nbsp;shared_ptr 鍜?unique_ptr銆?shared_ptr鍙槸鍗曠函鐨勫紩鐢ㄨ鏁版寚閽堬紝銆?nbsp;unique_ptr 鏄敤鏉ュ彇浠?code>auto_ptrunique_ptr 鎻愪緵 auto_ptr 澶ч儴浠界壒鎬э紝鍞竴鐨勪緥澶栨槸 auto_ptr 鐨勪笉瀹夊叏銆侀殣鎬х殑宸﹀兼惉縐匯備笉鍍?nbsp;auto_ptr錛?code>unique_ptr 鍙互瀛樻斁鍦?C++0x 鎻愬嚭鐨勯偅浜涜兘瀵熻鎼Щ鍔ㄤ綔鐨勫鍣ㄤ箣涓?/p>
鏂扮殑綆楁硶
all_of(), any_of() 鍜?nbsp;none_of()銆?/code>
#include <algorithm>//C++11 code//are all of the elements positive?all_of(first, first+n, ispositive()); //false//is there at least one positive element?any_of(first, first+n, ispositive());//true// are none of the elements positive?none_of(first, first+n, ispositive()); //false
#include <algorithm>int source[5]={0,12,34,50,80};int target[5];//copy 5 elements from source to targetcopy_n(source,5,target);iota() 鍙互鐢ㄦ潵鍒涘緩閫掑鐨勬暟鍒椼傚涓嬩緥鎵紺猴細
include <numeric>int a[5]={0};char c[3]={0};iota(a, a+5, 10); //changes a to {10,11,12,13,14}iota(c, c+3, 'a'); //{'a','b','c'}
The following table lists C++0x features and their support in popular compilers.
12.0(v1.0)
4.5(v2.1)
4.6(v3.0)
12.0(v2.0)
]]>gprof浠嬬粛
涓篻prof緙栬瘧紼嬪簭
鍦ㄧ紪璇戞垨閾炬帴婧愮▼搴忕殑鏃跺欏湪緙栬瘧鍣ㄧ殑鍛戒護琛屽弬鏁頒腑鍔犲叆“-pg”閫夐」錛岀紪璇戞椂緙栬瘧鍣ㄤ細鑷姩鍦ㄧ洰鏍囦唬鐮佷腑鎻掑叆鐢ㄤ簬鎬ц兘嫻嬭瘯鐨勪唬鐮佺墖鏂紝榪欎簺浠g爜鍦ㄧ▼搴忓湪榪愯鏃墮噰闆嗗茍璁板綍鍑芥暟鐨勮皟鐢ㄥ叧緋誨拰璋冪敤嬈℃暟錛屼互鍙婇噰闆嗗茍璁板綍鍑芥暟鑷韓鎵ц鏃墮棿鍜屽瓙鍑芥暟鐨勮皟鐢ㄦ椂闂達紝紼嬪簭榪愯緇撴潫鍚庯紝浼氬湪紼嬪簭閫鍑虹殑璺緞涓嬬敓鎴愪竴涓猤mon.out鏂囦歡銆傝繖涓枃浠跺氨鏄褰曞茍淇濆瓨涓嬫潵鐨勭洃鎺ф暟鎹傚彲浠ラ氳繃鍛戒護琛屾柟寮忕殑gprof鎴栧浘褰㈠寲鐨凨prof鏉ヨВ璇昏繖浜涙暟鎹茍瀵圭▼搴忕殑鎬ц兘榪涜鍒嗘瀽銆傚彟澶栵紝濡傛灉鎯蟲煡鐪嬪簱鍑芥暟鐨刾rofiling錛岄渶瑕佸湪緙栬瘧鏄啀鍔犲叆“-lc_p”緙栬瘧鍙傛暟浠f浛“-lc”緙栬瘧鍙傛暟錛岃繖鏍風▼搴忎細閾炬帴libc_p.a搴擄紝鎵嶅彲浠ヤ駭鐢熷簱鍑芥暟鐨刾rofiling淇℃伅銆傚鏋滄兂鎵ц涓琛屼竴琛岀殑profiling錛岃繕闇瑕佸姞鍏?#8220;-g”緙栬瘧鍙傛暟銆?br />渚嬪濡備笅鍛戒護琛岋細gcc -Wall -g -pg -lc_p example.c -o exampleGprof鍩烘湰鐢ㄦ硶錛?/em>
Flat profile:
no time accumulated
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 function
0.00 0.00 1/1 main [8]
[1] 0.0 0.00 0.00 1 function [1]
-----------------------------------------------
gprof浜х敓鐨勪俊鎭?/h1>
% the percentage of the total running time of the
time program used by this function.
鍑芥暟浣跨敤鏃墮棿鍗犳墍鏈夋椂闂寸殑鐧懼垎姣斻?br />cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
鍑芥暟鍜屼笂鍒楀嚱鏁扮瘡璁℃墽琛岀殑鏃墮棿銆?br />self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
鍑芥暟鏈韓鎵鎵ц鐨勬椂闂淬?br />calls the number of times this function was invoked, if
this function is profiled, else blank.
鍑芥暟琚皟鐢ㄧ殑嬈℃暟
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
姣忎竴嬈¤皟鐢ㄨ姳璐瑰湪鍑芥暟鐨勬椂闂磎icroseconds銆?br />total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
姣忎竴嬈¤皟鐢紝鑺辮垂鍦ㄥ嚱鏁板強鍏惰鐢熷嚱鏁扮殑騫沖潎鏃墮棿microseconds銆?br />name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
鍑芥暟鍚?/p>
鍛戒護鏍煎紡
]]>
澶х妯″紡浜屻佷婦渚嬭鏄?/span>
涓夈佷嬌鐢ㄤ唬鐮佸垽鏂ぇ灝忕妯″紡
]]>
1
錛?錛夊鎴風鍙戦佷竴涓甫SYN鏍囧織鐨凾CP鎶ユ枃鍒版湇鍔″櫒銆傝繖鏄笁嬈℃彙鎵嬭繃紼嬩腑鐨勬姤鏂?銆?br />錛?錛?鏈嶅姟鍣ㄧ鍥炲簲瀹㈡埛绔殑錛岃繖鏄笁嬈℃彙鎵嬩腑鐨勭2涓姤鏂囷紝榪欎釜鎶ユ枃鍚屾椂甯CK鏍囧織鍜孲YN鏍囧織銆傚洜姝ゅ畠琛ㄧず瀵瑰垰鎵嶅鎴風SYN鎶ユ枃鐨勫洖搴旓紱鍚屾椂鍙堟爣蹇桽YN緇欏鎴風錛岃闂鎴風鏄惁鍑嗗濂借繘琛屾暟鎹氳銆?br />錛?錛?瀹㈡埛蹇呴』鍐嶆鍥炲簲鏈嶅姟孌典竴涓狝CK鎶ユ枃錛岃繖鏄姤鏂囨3銆?br />2
銆 銆鐢變簬TCP榪炴帴鏄叏鍙屽伐鐨勶紝鍥犳姣忎釜鏂瑰悜閮藉繀欏誨崟鐙繘琛屽叧闂傝繖鍘熷垯鏄綋涓鏂瑰畬鎴愬畠鐨勬暟鎹彂閫佷換鍔″悗灝辮兘鍙戦佷竴涓狥IN鏉ョ粓姝㈣繖涓柟鍚戠殑榪炴帴銆傛敹鍒頒竴涓?FIN鍙剰鍛崇潃榪欎竴鏂瑰悜涓婃病鏈夋暟鎹祦鍔紝涓涓猅CP榪炴帴鍦ㄦ敹鍒頒竴涓狥IN鍚庝粛鑳藉彂閫佹暟鎹傞鍏堣繘琛屽叧闂殑涓鏂瑰皢鎵ц涓誨姩鍏抽棴錛岃屽彟涓鏂規墽琛岃鍔ㄥ叧闂?br />銆錛?錛?TCP瀹㈡埛绔彂閫佷竴涓狥IN錛岀敤鏉ュ叧闂鎴峰埌鏈嶅姟鍣ㄧ殑鏁版嵁浼犻侊紙鎶ユ枃孌?錛夈?br />銆錛?錛?鏈嶅姟鍣ㄦ敹鍒拌繖涓狥IN錛屽畠鍙戝洖涓涓狝CK錛岀‘璁ゅ簭鍙蜂負鏀跺埌鐨勫簭鍙峰姞1錛堟姤鏂囨5錛夈傚拰SYN涓鏍鳳紝涓涓狥IN灝嗗崰鐢ㄤ竴涓簭鍙楓?br />銆錛?錛?鏈嶅姟鍣ㄥ叧闂鎴風鐨勮繛鎺ワ紝鍙戦佷竴涓狥IN緇欏鎴風錛堟姤鏂囨6錛夈?br />銆錛?錛?瀹㈡埛孌靛彂鍥濧CK鎶ユ枃紜錛屽茍灝嗙‘璁ゅ簭鍙瘋緗負鏀跺埌搴忓彿鍔?錛堟姤鏂囨7錛夈?br />CLOSED: 榪欎釜娌′粈涔堝ソ璇寸殑浜嗭紝琛ㄧず鍒濆鐘舵併?br />LISTEN: 榪欎釜涔熸槸闈炲父瀹規槗鐞嗚В鐨勪竴涓姸鎬侊紝琛ㄧず鏈嶅姟鍣ㄧ鐨勬煇涓猄OCKET澶勪簬鐩戝惉鐘舵侊紝鍙互鎺ュ彈榪炴帴浜嗐?br />SYN_RCVD: 榪欎釜鐘舵佽〃紺烘帴鍙楀埌浜哠YN鎶ユ枃錛屽湪姝e父鎯呭喌涓嬶紝榪欎釜鐘舵佹槸鏈嶅姟鍣ㄧ鐨凷OCKET鍦ㄥ緩绔婽CP榪炴帴鏃剁殑涓夋鎻℃墜浼氳瘽榪囩▼涓殑涓涓腑闂寸姸鎬侊紝寰堢煭鏆傦紝鍩烘湰涓婄敤netstat浣犳槸寰堥毦鐪嬪埌榪欑鐘舵佺殑錛岄櫎闈炰綘鐗規剰鍐欎簡涓涓鎴風嫻嬭瘯紼嬪簭錛屾晠鎰忓皢涓夋TCP鎻℃墜榪囩▼涓渶鍚庝竴涓狝CK鎶ユ枃涓嶄簣鍙戦併傚洜姝よ繖縐嶇姸鎬佹椂錛屽綋鏀跺埌瀹㈡埛绔殑ACK鎶ユ枃鍚庯紝瀹冧細榪涘叆鍒癊STABLISHED鐘舵併?br />SYN_SENT: 榪欎釜鐘舵佷笌SYN_RCVD閬ユ兂鍛煎簲錛屽綋瀹㈡埛绔疭OCKET鎵цCONNECT榪炴帴鏃訛紝瀹冮鍏堝彂閫丼YN鎶ユ枃錛屽洜姝や篃闅忓嵆瀹冧細榪涘叆鍒頒簡SYN_SENT鐘舵侊紝騫剁瓑寰呮湇鍔$鐨勫彂閫佷笁嬈℃彙鎵嬩腑鐨勭2涓姤鏂囥係YN_SENT鐘舵佽〃紺哄鎴風宸插彂閫丼YN鎶ユ枃銆?br />ESTABLISHED錛氳繖涓鏄撶悊瑙d簡錛岃〃紺鴻繛鎺ュ凡緇忓緩绔嬩簡銆?br />FIN_WAIT_1: 榪欎釜鐘舵佽濂藉ソ瑙i噴涓涓嬶紝鍏跺疄FIN_WAIT_1鍜孎IN_WAIT_2鐘舵佺殑鐪熸鍚箟閮芥槸琛ㄧず絳夊緟瀵規柟鐨凢IN鎶ユ枃銆傝岃繖涓ょ鐘舵佺殑鍖哄埆鏄細FIN_WAIT_1鐘舵佸疄闄呬笂鏄綋SOCKET鍦‥STABLISHED鐘舵佹椂錛屽畠鎯充富鍔ㄥ叧闂繛鎺ワ紝鍚戝鏂瑰彂閫佷簡FIN鎶ユ枃錛屾鏃惰SOCKET鍗寵繘鍏ュ埌FIN_WAIT_1鐘舵併傝屽綋瀵規柟鍥炲簲ACK鎶ユ枃鍚庯紝鍒欒繘鍏ュ埌FIN_WAIT_2鐘舵侊紝褰撶劧鍦ㄥ疄闄呯殑姝e父鎯呭喌涓嬶紝鏃犺瀵規柟浣曠鎯呭喌涓嬶紝閮藉簲璇ラ┈涓婂洖搴擜CK鎶ユ枃錛屾墍浠IN_WAIT_1鐘舵佷竴鑸槸姣旇緝闅捐鍒扮殑錛岃孎IN_WAIT_2鐘舵佽繕鏈夋椂甯稿父鍙互鐢╪etstat鐪嬪埌銆?br />FIN_WAIT_2錛氫笂闈㈠凡緇忚緇嗚В閲婁簡榪欑鐘舵侊紝瀹為檯涓奆IN_WAIT_2鐘舵佷笅鐨凷OCKET錛岃〃紺哄崐榪炴帴錛屼篃鍗蟲湁涓鏂硅姹俢lose榪炴帴錛屼絾鍙﹀榪樺憡璇夊鏂癸紝鎴戞殏鏃惰繕鏈夌偣鏁版嵁闇瑕佷紶閫佺粰浣狅紝紼嶅悗鍐嶅叧闂繛鎺ャ?br />TIME_WAIT: 琛ㄧず鏀跺埌浜嗗鏂圭殑FIN鎶ユ枃錛屽茍鍙戦佸嚭浜咥CK鎶ユ枃錛屽氨絳?MSL鍚庡嵆鍙洖鍒癈LOSED鍙敤鐘舵佷簡銆傚鏋淔IN_WAIT_1鐘舵佷笅錛屾敹鍒頒簡瀵規柟鍚屾椂甯IN鏍囧織鍜孉CK鏍囧織鐨勬姤鏂囨椂錛屽彲浠ョ洿鎺ヨ繘鍏ュ埌TIME_WAIT鐘舵侊紝鑰屾棤欏葷粡榪嘑IN_WAIT_2鐘舵併?br />CLOSING: 榪欑鐘舵佹瘮杈冪壒孌婏紝瀹為檯鎯呭喌涓簲璇ユ槸寰堝皯瑙侊紝灞炰簬涓縐嶆瘮杈冪綍瑙佺殑渚嬪鐘舵併傛甯告儏鍐典笅錛屽綋浣犲彂閫丗IN鎶ユ枃鍚庯紝鎸夌悊鏉ヨ鏄簲璇ュ厛鏀跺埌錛堟垨鍚屾椂鏀跺埌錛夊鏂圭殑ACK鎶ユ枃錛屽啀鏀跺埌瀵規柟鐨凢IN鎶ユ枃銆備絾鏄疌LOSING鐘舵佽〃紺轟綘鍙戦丗IN鎶ユ枃鍚庯紝騫舵病鏈夋敹鍒板鏂圭殑ACK鎶ユ枃錛屽弽鑰屽嵈涔熸敹鍒頒簡瀵規柟鐨凢IN鎶ユ枃銆備粈涔堟儏鍐典笅浼氬嚭鐜版縐嶆儏鍐靛憿錛熷叾瀹炵粏鎯充竴涓嬶紝涔熶笉闅懼緱鍑虹粨璁猴細閭e氨鏄鏋滃弻鏂瑰嚑涔庡湪鍚屾椂close涓涓猄OCKET鐨勮瘽錛岄偅涔堝氨鍑虹幇浜嗗弻鏂瑰悓鏃跺彂閫丗IN鎶ユ枃鐨勬儏鍐碉紝涔熷嵆浼氬嚭鐜癈LOSING鐘舵侊紝琛ㄧず鍙屾柟閮芥鍦ㄥ叧闂璖OCKET榪炴帴銆?br />CLOSE_WAIT: 榪欑鐘舵佺殑鍚箟鍏跺疄鏄〃紺哄湪絳夊緟鍏抽棴銆傛庝箞鐞嗚В鍛紵褰撳鏂筩lose涓涓猄OCKET鍚庡彂閫丗IN鎶ユ枃緇欒嚜宸憋紝浣犵郴緇熸鏃犵枒闂湴浼氬洖搴斾竴涓狝CK鎶ユ枃緇欏鏂癸紝姝ゆ椂鍒欒繘鍏ュ埌CLOSE_WAIT鐘舵併傛帴涓嬫潵鍛紝瀹為檯涓婁綘鐪熸闇瑕佽冭檻鐨勪簨鎯呮槸瀵熺湅浣犳槸鍚﹁繕鏈夋暟鎹彂閫佺粰瀵規柟錛屽鏋滄病鏈夌殑璇濓紝閭d箞浣犱篃灝卞彲浠lose榪欎釜SOCKET錛屽彂閫丗IN鎶ユ枃緇欏鏂癸紝涔熷嵆鍏抽棴榪炴帴銆傛墍浠ヤ綘鍦–LOSE_WAIT鐘舵佷笅錛岄渶瑕佸畬鎴愮殑浜嬫儏鏄瓑寰呬綘鍘誨叧闂繛鎺ャ?br />LAST_ACK: 榪欎釜鐘舵佽繕鏄瘮杈冨鏄撳ソ鐞嗚В鐨勶紝瀹冩槸琚姩鍏抽棴涓鏂瑰湪鍙戦丗IN鎶ユ枃鍚庯紝鏈鍚庣瓑寰呭鏂圭殑ACK鎶ユ枃銆傚綋鏀跺埌ACK鎶ユ枃鍚庯紝涔熷嵆鍙互榪涘叆鍒癈LOSED鍙敤鐘舵佷簡銆?br />鏈鍚庢湁2涓棶棰樼殑鍥炵瓟錛屾垜鑷繁鍒嗘瀽鍚庣殑緇撹錛堜笉涓瀹氫繚璇?00%姝g‘錛?br />1銆?涓轟粈涔堝緩绔嬭繛鎺ュ崗璁槸涓夋鎻℃墜錛岃屽叧闂繛鎺ュ嵈鏄洓嬈℃彙鎵嬪憿錛?br />榪欐槸鍥犱負鏈嶅姟绔殑LISTEN鐘舵佷笅鐨凷OCKET褰撴敹鍒癝YN鎶ユ枃鐨勫緩榪炶姹傚悗錛屽畠鍙互鎶夾CK鍜孲YN錛圓CK璧峰簲絳斾綔鐢紝鑰孲YN璧峰悓姝ヤ綔鐢級鏀懼湪涓涓姤鏂囬噷鏉ュ彂閫併備絾鍏抽棴榪炴帴鏃訛紝褰撴敹鍒板鏂圭殑FIN鎶ユ枃閫氱煡鏃訛紝瀹冧粎浠呰〃紺哄鏂規病鏈夋暟鎹彂閫佺粰浣犱簡錛涗絾鏈繀浣犳墍鏈夌殑鏁版嵁閮藉叏閮ㄥ彂閫佺粰瀵規柟浜嗭紝鎵浠ヤ綘鍙互鏈繀浼氶┈涓婁細鍏抽棴SOCKET,涔熷嵆浣犲彲鑳借繕闇瑕佸彂閫佷竴浜涙暟鎹粰瀵規柟涔嬪悗錛屽啀鍙戦丗IN鎶ユ枃緇欏鏂規潵琛ㄧず浣犲悓鎰忕幇鍦ㄥ彲浠ュ叧闂繛鎺ヤ簡錛屾墍浠ュ畠榪欓噷鐨凙CK鎶ユ枃鍜孎IN鎶ユ枃澶氭暟鎯呭喌涓嬮兘鏄垎寮鍙戦佺殑銆?br />2銆?涓轟粈涔圱IME_WAIT鐘舵佽繕闇瑕佺瓑2MSL鍚庢墠鑳借繑鍥炲埌CLOSED鐘舵侊紵
榪欐槸鍥犱負錛氳櫧鐒跺弻鏂歸兘鍚屾剰鍏抽棴榪炴帴浜嗭紝鑰屼笖鎻℃墜鐨?涓姤鏂囦篃閮藉崗璋冨拰鍙戦佸畬姣曪紝鎸夌悊鍙互鐩存帴鍥炲埌CLOSED鐘舵侊紙灝卞ソ姣斾粠SYN_SEND鐘舵佸埌ESTABLISH鐘舵侀偅鏍鳳級錛涗絾鏄洜涓烘垜浠繀欏昏鍋囨兂緗戠粶鏄笉鍙潬鐨勶紝浣犳棤娉曚繚璇佷綘鏈鍚庡彂閫佺殑ACK鎶ユ枃浼氫竴瀹氳瀵規柟鏀跺埌錛屽洜姝ゅ鏂瑰浜嶭AST_ACK鐘舵佷笅鐨凷OCKET鍙兘浼氬洜涓鴻秴鏃舵湭鏀跺埌ACK鎶ユ枃錛岃岄噸鍙慒IN鎶ユ枃錛屾墍浠ヨ繖涓猅IME_WAIT鐘舵佺殑浣滅敤灝辨槸鐢ㄦ潵閲嶅彂鍙兘涓㈠け鐨凙CK鎶ユ枃銆?img src ="http://m.shnenglu.com/tianbianlan/aggbug/164020.html" width = "1" height = "1" />
]]>
]]>
鍓嶈█





]]>
]]>