锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲成av人片在线观看桃,一本色道**综合亚洲精品蜜桃冫,亚洲黄网站黄http://m.shnenglu.com/guying2008/涓篊++鐤媯zh-cnSun, 16 Nov 2025 12:32:42 GMTSun, 16 Nov 2025 12:32:42 GMT60C++ newhttp://m.shnenglu.com/guying2008/archive/2009/08/13/93195.htmlyanghaibaoyanghaibaoThu, 13 Aug 2009 06:47:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/08/13/93195.htmlhttp://www.scs.stanford.edu/~dm/home/papers/c++-new.html

yanghaibao 2009-08-13 14:47 鍙戣〃璇勮
]]>
娉ㄥ唽鍏徃鐨勬楠ゅ拰璐圭敤 http://m.shnenglu.com/guying2008/archive/2009/08/12/93036.htmlyanghaibaoyanghaibaoWed, 12 Aug 2009 08:33:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/08/12/93036.html
涓銆侀夋嫨鍏徃鐨勫艦寮忥細

鏅氱殑鏈夐檺璐d換鍏徃錛屾渶浣庢敞鍐岃祫閲?涓囧厓錛岄渶瑕?涓垨2涓互涓婄殑鑲′笢錛?

浠?6騫?鏈堣搗鏂扮殑鍏徃娉曡瀹氾紝鍏佽1涓偂涓滄敞鍐屾湁闄愯矗浠誨叕鍙革紝榪欑鐗規(guī)畩鐨勬湁闄愯矗浠誨叕鍙稿張縐?#8220;涓浜烘湁闄愬叕鍙?#8221;(浣嗗叕鍙稿悕縐頒腑涓嶄細鏈?#8220;涓浜?#8221;瀛楁牱錛屾墽鐓т笂浼氭敞鏄?#8220;鑷劧浜虹嫭璧?#8221;)錛屾渶浣庢敞鍐岃祫閲?0涓囧厓銆傚鏋滃彧鏈変綘涓涓漢浣滀負鑲′笢錛屽垯閫夋嫨涓浜烘湁闄愬叕鍙革紝鏈浣庢敞鍐岃祫閲?0涓囧厓錛涘鏋滀綘鍜屾湅鍙嬨佸浜哄悎浼欐姇璧勫垱涓氾紝鍙夋嫨鏅氱殑鏈夐檺鍏徃錛屾渶浣庢敞鍐岃祫閲?涓囧厓銆傚緩璁綘鍑嗗濂芥敞鍐岃祫閲?涓囧厓銆?

浜屻佹敞鍐屽叕鍙告墍闇鐨勬敞鍐岃祫鏂欙細
(1)涓漢璧勬枡錛堣韓浠借瘉銆佹硶浜烘埛鍙f湰澶嶅嵃浠舵垨鎴風睄璇佹槑銆佸眳浣忓湴鍧銆佺數璇濆彿鐮侊級
(2)娉ㄥ唽璧勯噾
(3)鎷熻娉ㄥ唽鍏徃鍚嶇О鑻ュ共
(4)鍏徃緇忚惀鑼冨洿
(5)縐熸埧鎴夸駭璇併佺璧佸悎鍚?
(6)鍏徃浣忔墍
(7)鑲′笢鍚嶅唽鍙婅偂涓滆仈緋葷數璇濄佽仈緋誨湴鍧
(8)鍏徃鐨勬満鏋勫強鍏朵駭鐢熷姙娉曘佽亴鏉冦佽浜嬭鍒?
(9)鍏徃绔犵▼

涓夈佹敞鍐屽叕鍙哥殑姝ラ錛?

1.鏍稿悕錛氬埌宸ュ晢灞鍘婚鍙栦竴寮?#8220;浼佷笟(瀛楀彿)鍚嶇О棰勫厛鏍稿噯鐢寵琛?#8221;錛屽~鍐欎綘鍑嗗鍙栫殑鍏徃鍚嶇О錛岀敱宸ュ晢灞涓婂伐鍟嗗眬鍐呴儴緗戞绱㈡槸鍚︽湁閲嶅悕錛屽鏋滄病鏈夐噸鍚嶏紝灝卞彲浠ヤ嬌鐢ㄨ繖涓悕縐幫紝灝變細鏍稿彂涓寮?#8220;浼佷笟(瀛楀彿)鍚嶇О棰勫厛鏍稿噯閫氱煡涔?#8221;銆傚伐鍟嗗悕縐版牳鍑嗚垂鏄?0鍏冿紝浜ょ粰宸ュ晢灞銆?40鍏冨彲浠ュ府浣犳绱?涓悕瀛楋紝寰堝鍚嶅瓧閲嶅錛屾墍浠ヤ竴鑸父瑙佺殑鍚嶅瓧灝變笉鐢ㄨ瘯浜嗭紝鍏嶅緱鑺卞啢鏋夐挶銆?

2.縐熸埧錛?鍘諱笓闂ㄧ殑鍐欏瓧妤肩涓闂村姙鍏錛屽鏋滀綘鑷繁鏈夊巶鎴挎垨鑰呭姙鍏涔熷彲浠ワ紝鏈夌殑鍦版柟涓嶅厑璁稿湪灞呮皯妤奸噷鍔炲叕銆?浣犺浜ゆ埧縐熺粰鎵縐熷姙鍏鐨勬埧涓?鎵鏈夋潈浜?錛屽亣璁懼姙鍏鐨勬埧縐熸槸1000鍏?鏈?涓鑸搗縐熸渶灝?涓湀,6涓湀鐨勬埧縐熸槸6000鍏冦?

3.絳捐縐熸埧鍚堝悓錛氫綘瑕佷笌浣犳墍縐熺殑鍔炲叕瀹ょ殑鎴夸笢絳懼畾縐熸埧鍚堝悓,騫惰鎴夸笢鎻愪緵鎴夸駭璇佺殑澶嶅嵃浠躲傜鎴垮悎鍚屾墦鍗拌垂5浠?5鍏冿紝鎴夸駭璇佸鍗頒歡5寮?.5鍏冦?

4.涔扮鎴跨殑鍗拌姳紼庯細浣犺鍒扮◣鍔″眬鍘諱拱鍗拌姳紼庯紝鎸夊勾縐熼噾鐨勫崈鍒嗕箣涓鐨勭◣鐜囪喘涔幫紝璐村湪鎴跨鍚堝悓鐨勯欏點備緥濡備綘鐨勬瘡騫存埧縐熸槸1.2涓囧厓錛岄偅灝辮涔?2鍏冮挶鐨勫嵃鑺辯◣錛屽悗闈㈠嚒鏄渶瑕佺敤鍒版埧縐熷悎鍚岀殑鍦版柟錛岄兘闇瑕佹槸璐翠簡鍗拌姳紼庣殑鍚堝悓澶嶅嵃浠躲?

5.緙栧啓“鍏徃绔犵▼”錛氬彲浠ュ湪宸ュ晢灞緗戠珯涓嬭澆“鍏徃绔犵▼”鐨勬牱鏈紝淇敼涓涓嬪氨鍙互浜嗐傜珷紼嬬殑鏈鍚庣敱鎵鏈夎偂涓滅鍚嶃?鍋囪绔犵▼鎵撳嵃5浠?鑲′笢2浜哄悇2浠姐佸伐鍟嗗眬1浠姐侀摱琛?浠姐佷細璁″笀浜嬪姟鎵1浠?錛岀珷紼嬫墦鍗拌垂15鍏冦佷笅杞藉叕鍙哥珷紼嬬殑涓婄綉璐?鍏冦?

6.鍒葷绔狅細 鍘昏涓婂埢绔犵殑鍦版柟鍒諱竴涓绔狅紝緇欎粬浠鍒繪硶浜虹绔?鏂瑰艦鐨?銆傚埢绔犺垂鐢?0鍏冦?

7.鍒頒細璁″笀浜嬪姟鎵棰嗗彇“閾惰璇㈠緛鍑?#8221;錛氳仈緋諱竴瀹朵細璁″笀浜嬪姟鎵錛岄鍙栦竴寮?#8220;閾惰璇㈠緛鍑?#8221;錛屽繀欏繪槸鍘熶歡錛屼細璁″笀浜嬪姟鎵鐩栭矞绔犮傚鏋滀綘涓嶆竻妤氾紝鍙互鐪嬫姤綰鎬笂鐨勫垎綾誨箍鍛婏紝鏈夊緢澶氫細璁″笀浜嬪姟鎵鐨勫箍鍛娿傞摱琛岃寰佸嚱10鍏冦?

8.鍘婚摱琛屽紑绔嬪叕鍙擱獙璧勬埛錛?鎵鏈夎偂涓滃甫涓婅嚜宸卞叆鑲$殑閭d竴閮ㄥ垎閽卞埌閾惰錛屽甫涓婂叕鍙哥珷紼嬨佸伐鍟嗗眬鍙戠殑鏍稿悕閫氱煡銆佹硶浜轟唬琛ㄧ殑縐佺珷銆佽韓浠借瘉銆佺敤浜庨獙璧勭殑閽便佺┖鐧借寰佸嚱琛ㄦ牸錛屽埌閾惰鍘誨紑绔嬪叕鍙稿笎鎴鳳紝浣犺鍛婅瘔閾惰鏄紑楠岃祫鎴楓傚紑绔嬪ソ鍏徃甯愭埛鍚庯紝鍚勪釜鑲′笢鎸夎嚜宸卞嚭璧勯鍚戝叕鍙稿笎鎴蜂腑瀛樺叆鐩稿簲鐨勯挶銆?閾惰浼氬彂緇欐瘡涓偂涓滅即嬈懼崟銆佸茍鍦ㄨ寰佸嚱涓婄洊閾惰鐨勭珷銆傚叕鍙擱獙璧勬埛寮鎴瘋垂20鍏冦?

娉ㄦ剰錛氬叕鍙告硶瑙勫畾錛屾敞鍐屽叕鍙告椂錛屾姇璧勪漢(鑲′笢)蹇呴』緙寸撼瓚抽鐨勮祫鏈紝鍙互浠ヨ捶甯佸艦寮?涔熷氨鏄漢姘戝竵)鍑鴻祫錛屼篃鍙互浠ュ疄鐗?濡傛苯杞︺佹埧浜с佺煡璇嗕駭鏉冪瓑)鍑鴻祫銆傚埌閾惰鍔炵殑鍙槸璐у竵鍑鴻祫榪欎竴閮ㄥ垎錛屽鏋滀綘鏈夊疄鐗┿佹埧浜х瓑浣滀負鍑鴻祫鐨勶紝闇瑕佸埌浼氳甯堜簨鍔℃墍閴村畾鍏朵環(huán)鍊煎悗鍐嶄互鍏跺疄闄呬環(huán)鍊煎嚭璧勶紝姣旇緝楹葷儲錛屽洜姝ゅ緩璁綘鐩存帴鎷塊挶鏉ュ嚭璧勶紝鍏徃娉曚笉綆′綘鐢ㄤ粈涔堟墜孌墊嬁鐨勯挶錛岃嚜宸辯殑涔熷ソ銆佸熺殑涔熷ソ錛屽彧瑕佸鏁扮即瓚沖嚭璧勬鍗沖彲銆?

9.鍔炵悊楠岃祫鎶ュ憡錛氭嬁鐫閾惰鍑哄叿鐨勮偂涓滅即嬈懼崟銆侀摱琛岀洊绔犲悗鐨勮寰佸嚱錛屼互鍙婂叕鍙哥珷紼嬨佹牳鍚嶉氱煡銆佹埧縐熷悎鍚屻佹埧浜ц瘉澶嶅嵃浠訛紝鍒頒細璁″笀浜嬪姟鎵鍔炵悊楠岃祫鎶ュ憡錛屼細璁″笀浜嬪姟甯堥獙璧勬姤鍛婃寜娉ㄥ唽璧勬湰鏀惰垂銆?0涓囧厓浠ヤ笅娉ㄥ唽璧勯噾楠岃祫璐?00鍏冦?

10.娉ㄥ唽鍏徃錛氬埌宸ュ晢灞棰嗗彇鍏徃璁劇珛鐧昏鐨勫悇縐嶈〃鏍鹼紝鍖呮嫭璁劇珛鐧昏鐢寵琛ㄣ佽偂涓?鍙戣搗浜?鍚嶅崟銆佽懀浜嬬粡鐞嗙洃鐞嗘儏鍐點佹硶浜轟唬琛ㄧ櫥璁拌〃銆佹寚瀹氫唬琛ㄦ垨濮旀墭浠g悊浜虹櫥璁拌〃銆傛敞鍐岀櫥璁拌垂錛屾寜娉ㄥ唽璧勯噾鐨勪竾鍒嗕箣8鏀跺彇銆傚~濂藉悗錛岃繛鍚屾牳鍚嶉氱煡銆佸叕鍙哥珷紼嬨佹埧縐熷悎鍚屻佹埧浜ц瘉澶嶅嵃浠躲侀獙璧勬姤鍛婁竴璧蜂氦緇欏伐鍟嗗眬銆傚ぇ姒?涓伐浣滄棩鍚庡彲棰嗗彇鎵х収銆傛敞鍐屽叕鍙告墜緇垂300鍏冦?

11.鍑惀涓氭墽鐓э紝鍒板叕瀹夊眬鐗硅縐戞寚瀹氱殑鍒葷珷紺撅紝鍘誨埢鍏珷銆佽儲鍔$珷銆傚悗闈㈡楠や腑錛屽潎闇瑕佺敤鍒板叕绔犳垨璐㈠姟绔犮傚叕绔?0鍏冿紝璐㈠姟绔?0鍏冦?

12.鍔炵悊浼佷笟緇勭粐鏈烘瀯浠g爜璇侊細鍑惀涓氭墽鐓у埌鎶鏈洃鐫e眬鍔炵悊緇勭粐鏈烘瀯浠g爜璇侊紝璐圭敤鏄?0鍏冦傚姙榪欎釜璇侀渶瑕佸崐涓湀錛屾妧鏈洃鐫e眬浼氶鍏堝彂涓涓鍏堝彈鐞嗕唬鐮佽瘉鏄庢枃浠訛紝鍑繖涓枃浠跺氨鍙互鍔炵悊鍚庨潰鐨勭◣鍔$櫥璁拌瘉銆侀摱琛屽熀鏈埛寮鎴鋒墜緇簡銆?

13.鍘婚摱琛屽紑鍩烘湰鎴鳳細鍑惀涓氭墽鐓с佺粍緇囨満鏋勪唬鐮佽瘉錛屽幓閾惰寮绔嬪熀鏈笎鍙楓傛渶濂芥槸鍦ㄥ師鏉ュ姙鐞嗛獙璧勬椂鐨勯偅涓摱琛岀殑鍚屼竴緗戠偣鍘誨姙鐞嗭紝鍚﹀垯錛屼細澶氭敹100鍏冪殑楠岃祫甯愭埛璐圭敤銆?寮鍩烘湰鎴烽渶瑕佸~寰堝琛紝浣犳渶濂芥妸鑳藉甫榻愮殑涓滆タ鍏ㄩ儴甯︿笂錛岃涓嶇劧瑕佽窇寰堝瓚燂紝鍖呮嫭钀ヤ笟鎵х収姝f湰鍘熶歡銆佽韓浠借瘉銆佺粍緇囨満鏋勪唬鐮佽瘉銆佸叕璐㈢珷銆佹硶浜虹珷銆?

寮鍩烘湰鎴鋒椂錛岃繕闇瑕佽喘涔頒竴涓瘑鐮佸櫒(浠?005騫翠笅鍗婂勾璧鳳紝澶у閾惰閮芥湁榪欎釜瑙勫畾)錛屼粖鍚庝綘鐨勫叕鍙稿紑鏀エ銆佸垝嬈炬椂錛岄兘闇瑕佷嬌鐢ㄥ瘑鐮佸櫒鏉ョ敓鎴愬瘑鐮併傚叕鍙稿熀鏈笎鍙峰紑鎴瘋垂20鍏冿紝瀵嗙爜鍣?80鍏冦?

14.鍔炵悊紼庡姟鐧昏錛氶鍙栨墽鐓у悗錛?0鏃ュ唴鍒板綋鍦扮◣鍔″眬鐢寵棰嗗彇紼庡姟鐧昏璇併備竴鑸殑鍏徃閮介渶瑕佸姙鐞?縐嶇◣鍔$櫥璁拌瘉錛屽嵆鍥界◣鍜屽湴紼庛傝垂鐢ㄦ槸鍚?0鍏冿紝鍏?0鍏冦?

15.璇峰吋鑱屼細璁★細鍔炵悊紼庡姟鐧昏璇佹椂錛屽繀欏繪湁涓涓細璁★紝鍥犱負紼庡姟灞瑕佹眰鎻愪氦鐨勮祫鏂欏叾涓湁涓欏規(guī)槸浼氳璧勬牸璇佸拰韜喚璇併備綘鍙厛璇蜂竴涓吋鑱屼細璁★紝灝忓叕鍙稿垰寮濮嬭鐨勫吋鑱屼細璁′竴鑸?00鍏冨伐璧勫氨鍙互浜嗐?

16.鐢寵棰嗚喘鍙戠エ錛氬鏋滀綘鐨勫叕鍙告槸閿鍞晢鍝佺殑錛屽簲璇ュ埌鍥界◣鍘葷敵璇峰彂紲紝濡傛灉鏄湇鍔℃ц川鐨勫叕鍙革紝鍒欏埌鍦扮◣鐢抽鍙戠エ銆?寮濮嬪彲鍏堥璐?00鍏冪殑鍙戠エ銆?

鏈鍚庡氨寮濮嬭惀涓氫簡銆?

鍥涖佹敞鍐屽叕鍙哥殑璐圭敤錛?
1銆佸伐鍟嗗眬宸ュ晢鍚嶇О鏍稿噯錛?0鍏?
2銆佸叕鍙稿姙鍏鎴跨6涓湀錛?000鍏?
3銆佺鎴垮悎鍚屾墦鍗拌垂5浠?5鍏冿紝鎴夸駭璇佸鍗頒歡5寮?.5鍏?
4銆佺鎴跨殑鍗拌姳紼?2鍏?
5銆佷笅杞藉叕鍙哥珷紼嬬殑涓婄綉璐?鍏冿紝鍏徃绔犵▼鎵撳嵃璐?5鍏?
6銆佸埢娉曚漢縐佺珷20鍏?
7銆佷細璁″笀浜嬪姟鎵鐨勯摱琛岃寰佸嚱10鍏?
8銆侀摱琛屽紑绔嬪叕鍙擱獙璧勬埛寮鎴瘋垂20鍏?
9銆佷細璁″笀浜嬪姟鎵鍔炵悊楠岃祫鎶ュ憡500鍏?
10銆佸伐鍟嗗眬娉ㄥ唽鍏徃鎵嬬畫璐?00鍏冿紝淇℃伅鍗?20鍏?
11銆佸叕绔?涓?20鍏冿紝璐㈠姟绔?涓?0鍏?
12銆佹妧鏈洃鐫e眬鍔炵悊緇勭粐鏈烘瀯浠g爜璇?48鍏?
13銆侀摱琛屽紑绔嬪叕鍙稿熀鏈笎鍙峰紑鎴瘋垂20鍏冦佸瘑鐮佸櫒280鍏?
14銆佸浗紼庣◣鍔$櫥璁拌瘉60鍏冿紝鍦扮◣紼庡姟鐧昏璇?0鍏?
15銆佸吋鑱屼細璁″伐璧勶紝200鍏?
16銆佺敵璇烽璐彂紲紝500鍏?
鍚堣錛?502.5鍏?
濡傛灉涓嶇畻鎴跨銆佷細璁″伐璧勩佸彂紲紝鍒欏悎璁?802.5鍏冦?

娉ㄥ唽璧勬湰鏈灝?涓囧厓銆?

娉ㄥ唽鐧昏璐規(guī)寜娉ㄥ唽璧勬湰鐨?.08%(1000涓囦互鍐?,0.04%(1000涓囦互涓婄殑瓚呰繃閮ㄥ垎)鏀跺彇

钀ヤ笟紼庯細閿鍞晢鍝佺殑鍏徃錛屾寜鎵寮鍙戠エ棰濈殑4%寰佹敹澧炴畺紼庯紱鎻愪緵鏈嶅姟鐨勫叕鍙革紝鎸夋墍寮鍙戠エ棰濈殑5%寰佹敹钀ヤ笟紼庛?

鎵寰楃◣錛氬浼佷笟鐨勭函鍒╂鼎寰佹敹18-33%鐨勪紒涓氭墍寰楃◣銆?
鍒╂鼎鏀跺叆鍦?涓囧厓錛堝惈3涓囧厓錛変互涓嬬殑紼庣巼涓?8%錛屽埄娑︽敹鍏ュ湪3涓囧厓浠ヤ笂10涓囧厓錛堝惈10涓囧厓錛夌殑紼庣巼涓?7%錛?0涓囧厓浠ヤ笂鐨勪負33%銆?

浜斻佹敞鍐屽叕鍙哥殑鐩稿叧璇存槑錛?

1.娉ㄥ唽鍏徃浼氫笉鍒板崐騫存椂闂達紝鏈蹇渶瑕?0澶╂椂闂淬傚湴鍖轟笉鍚屾敞鍐屽叕鍙哥殑璐圭敤涔熸湁鎵涓嶅悓銆?

2.瑕佹敞鍐屼竴涓叕鍙革紝棣栧厛鎯沖ソ緇忚惀浠涔堬紝鎬庢牱緇忚惀濂斤紝鍐嶆潵娉ㄥ唽銆傝涓嶏紝娉ㄥ唽浜嗕篃娌℃湁鐢紝娉ㄥ唽浜嗗叕鍙告槸闇瑕佸緢澶氭垚鏈殑錛屼笉鏄竴浠?#8220;濂界帺”鐨勪簨鎯呫?

3.娉ㄥ唽涓綋綆鍗曟槗鍔烇紱鑰屾敞鍐屽叕鍙歌鏈夌珷紼嬨佸悎鍚岋紝瑕侀獙璧勶紝紼嬪簭鎸哄鐨勩?鍦ㄦ姇鍏ヤ笉鏄お澶氭椂錛岃繕鏄敞鍐屼釜浣撲負濂姐?

4.鍓嶆湡鍙鎬у垎鏋愯皟鏌ワ紝寤鴻浣犺嚜宸辮鐪熺殑鑰冭檻涓涓?

5.鍏徃蹇呴』寤虹珛鍋ュ叏鐨勪細璁″埗搴︼紝浣犲彲鑳芥媴蹇冭嚜宸變笉浼氾紝鎬庝箞鍔烇紵鍒氬紑濮嬫垚绔嬬殑鍏徃錛屼笟鍔″皯錛屽浼氳鐨勫伐浣滈噺涔熼潪甯稿皬錛屼綘鍙互璇蜂竴涓吋鑱屼細璁★紝姣忎釜鏈堝埌浣犵殑鍏徃甯綘寤哄笎錛屼簩銆佷笁澶╂椂闂村氨澶熶簡錛岀粰浠?00-500宸﹀彸鐨勫伐璧勫嵆鍙?

6.姣忎釜鏈?鏃?10鏃ユ寜鏃跺悜紼庡姟鐢蟲姤紼庯紝鍗充嬌娌℃湁寮灞曚笟鍔′笉闇瑕佺即紼庯紝涔熻榪涜闆剁敵鎶ワ紝鍚﹀垯浼氳緗氭鐨勩傜綒嬈鵑搴﹁秴榪囦竴澶?00鍏冦傝惀涓氭墽鐓у姙鐞嗕笅鏉ュ悗涓涓湀鍐呭繀欏誨姙鐞嗙◣鍔$櫥璁般傛瘡騫?-6鏈堝勾瀹氭椂騫存钀ヤ笟鎵х収銆?

7.瀵逛紒涓氭墍寰楃◣錛屽仛甯愬緢鍏抽敭錛屽鏋滃笎闈笂浣犵殑鍒╂鼎寰堝錛岄偅紼庣巼灝遍珮銆傛墍浠ワ紝騫沖父鐨勮喘涔拌澶囬兘瑕佸紑鍙戠エ錛屼綘鍚冮キ銆佸潗杞︾殑紲ㄩ兘鐣欒搗鏉ワ紝鍙互鍋氫負浣犵殑浼佷笟榪愪綔鎴愭湰銆?

8.钀ヤ笟紼庢槸瀵硅惀涓氶寰佺◣錛屼笉綆′綘璧氭病鏈夎禋閽憋紝鍙湁鍙戠敓浜嗕氦鏄擄紝寮浜嗗彂紲紝灝辮寰佺◣錛涙墍寰楃◣錛屾槸瀵瑰埄娑﹀緛紼庯紝鍒╂鼎灝辨槸钀ヤ笟棰濇墸鍑忓悇縐嶆垚鏈悗鍓╀綑鐨勯挶錛屽彧鏈夎禋浜嗛挶錛屾墠浼氬緛鎵寰楃◣銆?

9.鏈夐檺璐d換鍏徃鍙互娉ㄥ唽鍒嗗叕鍙搞?

10.寮鍔炶垂鏄寚浼佷笟鍦ㄧ寤烘湡闂村彂鐢熺殑璐圭敤錛屽寘鎷寤烘湡浜哄憳宸ヨ祫銆佸姙鍏垂銆佸煿璁垂銆佸樊鏃呰垂銆佸嵃鍒瘋垂銆佹敞鍐岀櫥璁拌垂浠ュ強涓嶈鍏ュ浐瀹氳祫浜у拰鏃犲艦璧勪駭璐緩鎴愭湰鐨勬眹鍏戞崯鐩婂拰鍒╂伅鏀嚭銆傜寤烘湡鏄寚浼佷笟琚壒鍑嗙寤轟箣鏃ヨ搗鑷沖紑濮嬬敓浜с佺粡钀ワ紙鍖呮嫭璇曠敓浜с佽瘯钀ヤ笟錛変箣鏃ョ殑鏈熼棿銆?


yanghaibao 2009-08-12 16:33 鍙戣〃璇勮
]]>
[杞笘] c++涓殑explicit鍏抽敭瀛?/title><link>http://m.shnenglu.com/guying2008/archive/2009/07/24/91053.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Fri, 24 Jul 2009 08:49:00 GMT</pubDate><guid>http://m.shnenglu.com/guying2008/archive/2009/07/24/91053.html</guid><description><![CDATA[ c++涓殑explicit鍏抽敭瀛楃敤鏉ヤ慨楗扮被鐨勬瀯閫犲嚱鏁幫紝琛ㄦ槑璇ユ瀯閫犲嚱鏁版槸鏄懼紡鐨勶紝鏃㈢劧鏈?鏄懼紡"閭d箞蹇呯劧灝辨湁"闅愬紡"錛岄偅涔堜粈涔堟槸鏄劇ず鑰屼粈涔堝張鏄殣寮忕殑鍛紵<br><br>濡傛灉c++綾葷殑鏋勯犲嚱鏁版湁涓涓弬鏁幫紝閭d箞鍦ㄧ紪璇戠殑鏃跺欏氨浼氭湁涓涓己鐪佺殑杞崲鎿嶄綔錛氬皢璇ユ瀯閫犲嚱鏁板搴旀暟鎹被鍨嬬殑鏁版嵁杞崲涓鴻綾誨璞★紝濡備笅闈㈡墍紺猴細<br>class MyClass<br>{<br>public:<br>MyClass( int num );<br>}<br>....<br>MyClass obj = 10; //ok,convert int to MyClass<br>鍦ㄤ笂闈㈢殑浠g爜涓紪璇戝櫒鑷姩灝嗘暣鍨嬭漿鎹負MyClass綾誨璞★紝瀹為檯涓婄瓑鍚屼簬涓嬮潰鐨勬搷浣滐細<br>MyClass temp(10);<br>MyClass obj = temp;<br>涓婇潰鐨勬墍鏈夌殑鎿嶄綔鍗蟲槸鎵璋撶殑"闅愬紡杞崲"銆?br><br>濡傛灉瑕侀伩鍏嶈繖縐嶈嚜鍔ㄨ漿鎹㈢殑鍔熻兘錛屾垜浠鎬庝箞鍋氬憿錛熷樋鍢胯繖灝辨槸鍏抽敭瀛梕xplicit鐨勪綔鐢ㄤ簡錛屽皢綾葷殑鏋勯犲嚱鏁板0鏄庝負"鏄劇ず"錛屼篃灝辨槸鍦ㄥ0鏄庢瀯閫犲嚱鏁扮殑鏃跺欏墠闈㈡坊鍔犱笂explicit鍗沖彲錛岃繖鏍峰氨鍙互闃叉榪欑鑷姩鐨勮漿鎹㈡搷浣滐紝濡傛灉鎴戜滑淇敼涓婇潰鐨凪yClass綾葷殑鏋勯犲嚱鏁頒負鏄劇ず鐨勶紝閭d箞涓嬮潰鐨勪唬鐮佸氨涓嶈兘澶熺紪璇戦氳繃浜嗭紝濡備笅鎵紺猴細<br>class MyClass<br>{<br>public:<br>explicit MyClass( int num );<br>}<br>....<br>MyClass obj = 10; //err,can't non-explict convert<br><br>class isbn_mismatch:public std::logic_error{<br>public:<br>explicit isbn_missmatch(const std::string &s):std:logic_error(s){}<br>isbn_mismatch(const std::string &s,const std::string &lhs,const std::string &rhs):<br>std::logic_error(s),left(lhs),right(rhs){}<br>const std::string left,right;<br>virtual ~isbn_mismatch() throw(){}<br>};<br><br><br>Sales_item& operator+(const Sales_item &lhs,const Sales_item rhs)<br>{<br>if(!lhs.same_isbn(rhs))<br>   throw isbn_mismatch("isbn missmatch",lhs.book(),rhs.book());<br>Sales_item ret(lhs);<br>ret+rhs;<br>return ret;<br>}<br><br><br>Sales_item item1,item2,sum;<br>while(cin>>item1>>item2)<br>{<br>try{<br>   sun=item1+item2;<br>}catch(const isbn_mismatch &e)<br>{<br>   cerr<<e.what()<<"left isbn is:"<<e.left<<"right isbn is:"<<e.right<<endl;<br>}<br>}<br><br>鐢ㄤ簬鐢ㄦ埛鑷畾涔夌被鍨嬬殑鏋勯犲嚱鏁?鎸囧畾瀹冩槸榛樿鐨勬瀯閫犲嚱鏁?涓嶅彲鐢ㄤ簬杞崲鏋勯犲嚱鏁?鍥犱負鏋勯犲嚱鏁版湁涓夌:1鎷瘋礉鏋勯犲嚱鏁?杞崲鏋勯犲嚱鏁?涓鑸殑鏋勯犲嚱鏁?鎴戣嚜宸辯殑鏈^_^)<br>鍙?濡傛灉涓涓被鎴栫粨鏋勫瓨鍦ㄥ涓瀯閫犲嚱鏁版椂,explicit 淇グ鐨勯偅涓瀯閫犲嚱鏁板氨鏄粯璁ょ殑<br><br>class isbn_mismatch:public std::logic_error{<br>public:<br>explicit isbn_missmatch(const std::string &s):std:logic_error(s){}<br>isbn_mismatch(const std::string &s,const std::string &lhs,const std::string &rhs):<br>std::logic_error(s),left(lhs),right(rhs){}<br>const std::string left,right;<br>virtual ~isbn_mismatch() throw(){}<br>};<br><br><br>Sales_item& operator+(const Sales_item &lhs,const Sales_item rhs)<br>{<br>if(!lhs.same_isbn(rhs))<br>   throw isbn_mismatch("isbn missmatch",lhs.book(),rhs.book());<br>Sales_item ret(lhs);<br>ret+rhs;<br>return ret;<br>}<br><br><br>Sales_item item1,item2,sum;<br>while(cin>>item1>>item2)<br>{<br>try{<br>   sun=item1+item2;<br>}catch(const isbn_mismatch &e)<br>{<br>   cerr<<e.what()<<"left isbn is:"<<e.left<<"right isbn is:"<<e.right<<endl;<br>}<br>}<br><br> <br><br>榪欎釜 銆夾NSI/ISO C++ Professional Programmer's Handbook 銆嬫槸榪欐牱璇寸殑<br><br>explicit Constructors<br>A constructor that takes a single argument is, by default, an implicit conversion operator, which converts its argument to<br>an object of its class (see also Chapter 3, "Operator Overloading"). Examine the following concrete example:<br>class string<br>{<br>private:<br>int size;<br>int capacity;<br>char *buff;<br>public:<br>string();<br>string(int size); // constructor and implicit conversion operator<br>string(const char *); // constructor and implicit conversion operator<br>~string();<br>};<br>Class string has three constructors: a default constructor, a constructor that takes int, and a constructor that<br>constructs a string from const char *. The second constructor is used to create an empty string object with an<br>initial preallocated buffer at the specified size. However, in the case of class string, the automatic conversion is<br>dubious. Converting an int into a string object doesn't make sense, although this is exactly what this constructor does.<br><br>Consider the following:<br>int main()<br>{<br>string s = "hello"; //OK, convert a C-string into a string object<br>int ns = 0;<br>s = 1; // 1 oops, programmer intended to write ns = 1,<br>}<br>In the expression s= 1;, the programmer simply mistyped the name of the variable ns, typing s instead. Normally,<br>the compiler detects the incompatible types and issues an error message. However, before ruling it out, the compiler first<br>searches for a user-defined conversion that allows this expression; indeed, it finds the constructor that takes int.<br>Consequently, the compiler interprets the expression s= 1; as if the programmer had written<br>s = string(1);<br>You might encounter a similar problem when calling a function that takes a string argument. The following example<br>can either be a cryptic coding style or simply a programmer's typographical error. However, due to the implicit<br>conversion constructor of class string, it will pass unnoticed:<br>int f(string s);<br>int main()<br>{<br>f(1); // without a an explicit constructor,<br>//this call is expanded into: f ( string(1) );<br>//was that intentional or merely a programmer's typo?<br>}<br>'In order to avoid such implicit conversions, a constructor that takes one argument needs to be declared explicit:<br>class string<br>{<br>//...<br>public:<br>explicit string(int size); // block implicit conversion<br>string(const char *); //implicit conversion<br>~string();<br>};<br>An explicit constructor does not behave as an implicit conversion operator, which enables the compiler to catch the<br>typographical error this time:<br>int main()<br>{<br>string s = "hello"; //OK, convert a C-string into a string object<br>int ns = 0;<br>s = 1; // compile time error ; this time the compiler catches the typo<br>}<br>Why aren't all constructors automatically declared explicit? Under some conditions, the automatic type conversion is<br>useful and well behaved. A good example of this is the third constructor of string:<br>string(const char *);<br><br>The implicit type conversion of const char * to a string object enables its users to write the following:<br>string s;<br>s = "Hello";<br>The compiler implicitly transforms this into<br>string s;<br>//pseudo C++ code:<br>s = string ("Hello"); //create a temporary and assign it to s<br>On the other hand, if you declare this constructor explicit, you have to use explicit type conversion:<br>class string<br>{<br>//...<br>public:<br>explicit string(const char *);<br>};<br>int main()<br>{<br>string s;<br>s = string("Hello"); //explicit conversion now required<br>return 0;<br>}<br>Extensive amounts of legacy C++ code rely on the implicit conversion of constructors. The C++ Standardization<br>committee was aware of that. In order to not make existing code break, the implicit conversion was retained. However, a<br>new keyword, explicit, was introduced to the languageto enable the programmer to block the implicit conversion<br>when it is undesirable. As a rule, a constructor that can be invoked with a single argument needs to be declared<br>explicit. When the implicit type conversion is intentional and well behaved, the constructor can be used as an<br>implicit conversion operator.<br><br>緗戜笂鎵劇殑璁茬殑鏈濂界殑璐達細<br><br>C++ 涓?explicit 鍏抽敭瀛楃殑浣滅敤<br>鍦?C++ 涓紝 濡傛灉涓涓被鏈夊彧鏈変竴涓弬鏁扮殑鏋勯犲嚱鏁幫紝C++ 鍏佽涓縐嶇壒孌婄殑澹版槑綾誨彉閲忕殑鏂瑰紡銆傚湪榪欑鎯呭喌涓嬶紝鍙互鐩存帴灝嗕竴涓搴斾簬鏋勯犲嚱鏁板弬鏁扮被鍨嬬殑鏁版嵁鐩存帴璧嬪肩粰綾誨彉閲忥紝緙栬瘧鍣ㄥ湪緙栬瘧鏃朵細鑷姩榪涜綾誨瀷杞崲錛屽皢瀵瑰簲浜庢瀯閫犲嚱鏁板弬鏁扮被鍨嬬殑鏁版嵁杞崲涓虹被鐨勫璞°?濡傛灉鍦ㄦ瀯閫犲嚱鏁板墠鍔犱笂 explicit 淇グ璇嶏紝 鍒欎細紱佹榪欑鑷姩杞崲錛屽湪榪欑鎯呭喌涓嬶紝鍗充嬌灝嗗搴斾簬鏋勯犲嚱鏁板弬鏁扮被鍨嬬殑鏁版嵁鐩存帴璧嬪肩粰綾誨彉閲忥紝緙栬瘧鍣ㄤ篃浼氭姤閿欍?br><br>涓嬮潰浠ュ叿浣撳疄渚嬫潵璇存槑銆?br><br>寤虹珛people.cpp 鏂囦歡錛岀劧鍚庤緭鍏ヤ笅鍒楀唴瀹癸細<br><br>class People<br>{<br>public:<br>int age;<br>explicit People (int a)<br> {<br>  age=a;<br> }<br>};<br>void foo ( void )<br>{<br> People p1(10);  //鏂瑰紡涓<br> People* p_p2=new People(10); //鏂瑰紡浜?br> People p3=10; //鏂瑰紡涓?br>}<br>榪欐 C++ 紼嬪簭瀹氫箟浜嗕竴涓被 people 錛屽寘鍚竴涓瀯閫犲嚱鏁幫紝 榪欎釜鏋勯犲嚱鏁板彧鍖呭惈涓涓暣褰㈠弬鏁?a 錛屽彲鐢ㄤ簬鍦ㄦ瀯閫犵被鏃跺垵濮嬪寲 age 鍙橀噺銆?br><br>鐒跺悗瀹氫箟浜嗕竴涓嚱鏁癴oo錛屽湪榪欎釜鍑芥暟涓垜浠敤涓夌鏂瑰紡鍒嗗埆鍒涘緩浜嗕笁涓?0宀佺殑“浜?#8221;銆傜涓縐嶆槸鏈涓鑸殑綾誨彉閲忓0鏄庢柟寮忋傜浜岀鏂瑰紡鍏跺疄鏄0鏄庝簡涓涓猵eople綾葷殑鎸囬拡鍙橀噺錛岀劧鍚庡湪鍫嗕腑鍔ㄦ佸垱寤轟簡涓涓猵eople瀹炰緥錛屽茍鎶婅繖涓疄渚嬬殑鍦板潃璧嬪肩粰浜唒_p2銆傜涓夌鏂瑰紡灝辨槸鎴戜滑鎵璇寸殑鐗規(guī)畩鏂瑰紡錛屼負浠涔堣鐗規(guī)畩鍛紵鎴戜滑閮界煡閬擄紝C/C++鏄竴縐嶅己綾誨瀷璇█錛屼笉鍚岀殑鏁版嵁綾誨瀷鏄笉鑳介殢鎰忚漿鎹㈢殑錛屽鏋滆榪涜綾誨瀷杞崲錛屽繀欏昏繘琛屾樉寮忓己鍒剁被鍨嬭漿鎹紝鑰岃繖閲岋紝娌℃湁榪涜浠諱綍鏄懼紡鐨勮漿鎹紝鐩存帴灝嗕竴涓暣鍨嬫暟鎹祴鍊肩粰浜嗙被鍙橀噺p3銆?br><br>鍥犳錛屽彲浠ヨ錛岃繖閲岃繘琛屼簡涓嬈¢殣寮忕被鍨嬭漿鎹紝緙栬瘧鍣ㄨ嚜鍔ㄥ皢瀵瑰簲浜庢瀯閫犲嚱鏁板弬鏁扮被鍨嬬殑鏁版嵁杞崲涓轟簡璇ョ被鐨勫璞★紝鍥犳鏂瑰紡涓夌粡緙栬瘧鍣ㄨ嚜鍔ㄨ漿鎹㈠悗鍜屾柟寮忎竴鏈緇堢殑瀹炵幇鏂瑰紡鏄竴鏍風殑銆?br><br>涓嶇浉淇★紵 鑰沖惉涓鴻櫄錛岀溂瑙佷負瀹烇紝璁╂垜浠湅鐪嬪簳灞傜殑瀹炵幇鏂瑰紡銆?br><br>涓轟簡鏇村鏄撴瘮杈冩柟寮忎竴鍜屾柟寮忎笁鐨勫疄鐜版柟寮忥紝鎴戜滑瀵逛笂闈㈢殑浠g爜浣滀竴鐐逛慨鏀癸紝鍘婚櫎鏂瑰紡浜岋細<br><br>void foo ( void )<br>{<br> People p1(10);  //鏂瑰紡涓<br> People p3=10; //鏂瑰紡涓?br>}<br>鍘婚櫎鏂瑰紡浜岀殑鍘熷洜鏄柟寮忎簩鏄湪鍫嗕笂鍔ㄦ佸垱寤虹被瀹炰緥錛屽洜姝や細鏈変竴浜涢澶栦唬鐮佸獎鍝嶅垎鏋愩備慨鏀瑰畬鎴愬悗錛岀敤涓嬪垪鍛戒護緙栬瘧 people.cpp<br><br>$ gcc -S people.cpp<br><br>"-S"閫夐」鏄疓CC杈撳嚭姹囩紪浠g爜銆傚懡浠ゆ墽琛屽悗錛岄粯璁ょ敓鎴恜eople.s銆?鍏抽敭閮ㄥ垎鍐呭濡備笅錛?br><br>.globl _Z3foov<br>.type _Z3foov, @function<br>_Z3foov:<br>.LFB5:<br> pushl %ebp<br>.LCFI2:<br> movl %esp, %ebp<br>.LCFI3:<br> subl $24, %esp<br>.LCFI4:<br> movl $10, 4(%esp)<br> leal -4(%ebp), %eax<br> movl %eax, (%esp)<br> call _ZN6PeopleC1Ei<br> movl $10, 4(%esp)<br> leal -8(%ebp), %eax<br> movl %eax, (%esp)<br> call _ZN6PeopleC1Ei<br> leave<br> ret<br><br>鐪?#8220;.LCFI4” 琛屽悗闈㈢殑涓滆タ錛?-4琛屽拰5-8琛屽嚑涔庝竴妯′竴鏍鳳紝1-4琛屽嵆涓烘柟寮忎竴鐨勬眹緙栦唬鐮侊紝5-8鍗充負鏂瑰紡涓夌殑姹囩紪浠g爜銆?緇嗗績鐨勪綘鍙兘鍙戠幇2鍜?琛屾湁鎵涓嶅悓錛屼竴涓槸 -4(%ebp) 鑰屽彟涓涓竴涓槸 -8(%ebp) 錛岃繖鍒嗗埆涓虹被鍙橀噺P1鍜孭3鐨勫湴鍧銆?br><br>瀵逛簬涓嶅彲闅忔剰榪涜綾誨瀷杞崲鐨勫己綾誨瀷璇█C/C++鏉ヨ, 榪欏彲浠ヨ鏄疌++鐨勪竴涓壒鎬с傚摝錛屼粖澶╁ソ鍍忎笉鏄璇碈++鐨勭壒鎬э紝鑰屾槸瑕佺煡閬揺xplicit鍏抽敭瀛楃殑浣滅敤錛?br><br>explicit鍏抽敭瀛楀埌搴曟槸浠涔堜綔鐢ㄥ憿錛?瀹冪殑浣滅敤灝辨槸紱佹榪欎釜鐗規(guī)с傚鏂囩珷涓寮濮嬭岃█錛屽嚒鏄敤explicit鍏抽敭瀛椾慨楗扮殑鏋勯犲嚱鏁幫紝緙栬瘧鏃跺氨涓嶄細榪涜鑷姩杞崲錛岃屼細鎶ラ敊銆?br><br>璁╂垜浠湅鐪嬪惂錛?淇敼浠g爜錛?br><br>class People<br>{<br>public:<br>int age;<br>explicit People (int a)<br> {<br>  age=a;<br> }<br>};<br>鐒跺悗鍐嶇紪璇戯細<br>$ gcc -S people.cpp<br>緙栬瘧鍣ㄧ珛椹姤閿欙細<br>people.cpp: In function ‘void foo()’:<br>people.cpp:23: 閿欒錛氳姹備粠 ‘int’ 杞崲鍒伴潪鏍囬噺綾誨瀷 ‘People’ <div class="hvzpftn" id=div_digg></div> <img src ="http://m.shnenglu.com/guying2008/aggbug/91053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-24 16:49 <a href="http://m.shnenglu.com/guying2008/archive/2009/07/24/91053.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>瑙傚療鑰呮ā寮忚В鏋?/title><link>http://m.shnenglu.com/guying2008/archive/2009/07/22/90864.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 15:19:00 GMT</pubDate><guid>http://m.shnenglu.com/guying2008/archive/2009/07/22/90864.html</guid><description><![CDATA[杞歡璁捐涓細紕板埌榪欐牱鐨勫叧緋伙細涓涓璞′緷璧栦簬鍙︿竴涓璞★紝蹇呴』鏍規(guī)嵁鍚庤呯殑鐘舵佹洿鏂拌嚜宸辯殑鐘舵侊紝鍙互鎶婂悗鑰呯О浣滅洰鏍囧璞★紝鍓嶈呯О浣滆瀵熻呭璞°備笉浣嗚瀵熻呬緷璧栦簬鐩爣錛屽綋鐩爣鐨勭姸鎬佹敼鍙樻椂涔熻閫氱煡瑙傚療鑰咃紝榪欏氨鍑虹幇浜嗗弻鍚戠殑渚濊禆銆備袱涓璞′簰鐩鎬緷璧栫殑鍚庢灉鏄畠浠繀欏諱竴璧峰鐢ㄣ傚鏋滀竴涓洰鏍囨湁澶氫釜瑙傚療鑰咃紝閭d箞鐩爣涔熶緷璧栨墍鏈夎瀵熻咃紝浠庤岀洰鏍囧璞℃棤娉曠嫭绔嬪鐢ㄣ傚浣曟秷闄ょ洰鏍囧拰瑙傚療鑰呬箣闂寸殑浜掔浉渚濊禆鍛紵瑙傚療鑰呮ā寮忓府鍔╂垜浠В鍐寵繖涓棶棰樸?br><br>瑙傚療鑰呮ā寮忔妸鐩爣瀵硅瀵熻呯殑渚濊禆榪涜鎶借薄錛氫嬌鐩爣鍙煡閬撹嚜宸辨湁鑻ュ共瑙傚療鑰咃紝浣嗕笉鐭ラ亾榪欎簺瑙傚療鑰呭叿浣撴槸璋侊紝鍙兘鏈夊灝戜釜錛涘綋鐩爣鐘舵佹敼鍙樻椂鍙緇欒繖浜涜瀵熻呬竴涓氱煡錛屼笉蹇呬綔鏇村鐨勪簨鎯呫傝繖鏍風洰鏍囧瑙傚療鑰呯殑渚濊禆灝辮揪鍒頒簡鎶借薄鍜屾渶灝忥紝鑰岀洰鏍囧鍏蜂綋瑙傚療鑰呯殑渚濊禆琚В闄や簡銆?br><br>綾誨浘濡備笅錛?br><br><img src="http://m.shnenglu.com/WebResource.axd?d=pLXXeGbWF7eXU8SMs2-GFZvUWY2JNH05dFx5YzJhGUYAYJAFEaTEq36NAhTPy7_KekvzDFwt8wvQWdByvJIGWdEq6x2KpKD80&t=632780334567500000" width=1 height=1><img border=0 alt=Observer.JPG src="http://m.shnenglu.com/images/cppblog_com/zliner/Observer.JPG" width=448 height=340><br><br>Subject 瀵硅薄淇濆瓨涓涓狾bserver寮曠敤鐨勫垪琛紝褰撴垜浠涓涓狢oncreteObserver瀵硅薄瑙傚療Subject瀵硅薄鏃訛紝璋冪敤鍚庤呯殑Attach()鏂規(guī)硶錛屽皢鍓嶈呯殑寮曠敤鍔犲叆璇ュ垪琛ㄤ腑銆傚綋Subject瀵硅薄鐘舵佹敼鍙樻椂錛屽畠璋冪敤鑷韓鐨凬otify鏂規(guī)硶錛岃鏂規(guī)硶璋冪敤鍒楄〃涓瘡涓涓狾bserver鐨?Update()鏂規(guī)硶銆備竴涓狢oncreteObserver鍙閲嶅畾涔塙pdate()灝辮兘鏀跺埌閫氱煡錛屼綔涓哄閫氱煡鐨勫搷搴旓紝Update()璋冪敤 Subject瀵硅薄鐨刧etStatus()鑾峰彇鏁版嵁錛岀劧鍚庢洿鏂拌嚜韜傚綋涓嶉渶瑕佺戶緇瀵熸椂錛孋oncreteObserver瀵硅薄璋冪敤Subject瀵硅薄鐨凞etach()鏂規(guī)硶錛屽叾寮曠敤琚粠鍒楄〃涓Щ闄ゃ?br><br>瑙i櫎鐩爣瀵瑰叿浣撹瀵熻呯殑渚濊禆浠ュ悗錛屽緢瀹規(guī)槗澧炲姞鏂扮殑鍏蜂綋瑙傚療鑰咃紝鍥犱負涓嶅彈渚濊禆鐨勬柟闈㈠氨鍙互鑷敱鍙樺寲錛涜岀洰鏍囦篃鍙互鐙珛鍦板鐢紝鍥犱負鏃犳墍渚濊禆鐨勬柟闈㈠氨鍙互涓嶅彈褰卞搷銆?br><br>浠ヤ笂涓昏鑰冭檻浜嗕竴涓洰鏍囨湁澶氫釜瑙傚療鑰呯殑鎯呭喌錛屾垜浠娉曡В闄や簡鐩爣瀵瑰叿浣撹瀵熻呯殑渚濊禆錛屼嬌鍏蜂綋瑙傚療鑰呯殑縐嶇被鍜屾暟鐩鏄撴敼鍙樸傛湁鏃跺欎竴涓瀵熻呰瀵熷涓洰鏍囦篃鏄湁鎰忎箟鐨勶紝鍦ㄥ墠闈㈢殑綾誨浘涓紝瑙傚療鑰呭鍏蜂綋鐩爣鐨勪緷璧栦粛鐒跺瓨鍦紝鍥犳鏃犳硶閫傚簲鐩爣鏂歸潰鐨勫彉鍖栥傛庢牱鎶借薄榪欑渚濊禆鍛紵浣胯瀵熻呭彧鐭ラ亾鑻ュ共涓洰鏍囦細鍚戣嚜宸卞彂鍑洪氱煡錛岃屼笉鐭ラ亾榪欎簺鐩爣鍏蜂綋鏄皝錛屽彲鑳芥湁澶氬皯涓紱鍦ㄧ洰鏍囧悜瑙傚療鑰呭彂閫侀氱煡鏃訛紝灝嗕竴涓嚜韜殑寮曠敤浣滀負鍙傛暟錛岀劧鍚庤瀵熻呰皟鐢ㄥ叾鎶借薄鏂規(guī)硶灝卞彲浠ヨ幏寰楃洰鏍囩姸鎬併傝繖灝變嬌寰楄瀵熻呭鐩爣鐨勪緷璧栨槸鎶借薄鐨勶紝瑙傚療鑰呭鍏蜂綋鐩爣鐨勪緷璧栬瑙i櫎浜嗐?br><br>綾誨浘濡備笅錛?br><br><img border=0 alt=Observer2.JPG src="http://m.shnenglu.com/images/cppblog_com/zliner/Observer2.JPG" width=541 height=442><br><br>鍙傝冭祫鏂欙細<br><br>1.銆婅璁℃ā寮?鍙鐢ㄩ潰鍚戝璞¤蔣浠剁殑鍩虹銆?Erich Gamma絳夎憲錛屾潕鑻卞啗絳夎瘧 鏈烘宸ヤ笟鍑虹増紺? <img src ="http://m.shnenglu.com/guying2008/aggbug/90864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 23:19 <a href="http://m.shnenglu.com/guying2008/archive/2009/07/22/90864.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>C++緙栫▼瀹炵幇璁$畻CPU鍗犵敤鐜?/title><link>http://m.shnenglu.com/guying2008/archive/2009/07/22/90850.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 10:11:00 GMT</pubDate><guid>http://m.shnenglu.com/guying2008/archive/2009/07/22/90850.html</guid><description><![CDATA[璧峰涔? <script type=text/javascript><!-- google_ad_client = "pub-7345584400661736"; /* 336x280, 鍒涘緩浜?08-4-7,涓璧風編瀹?*/ google_ad_slot = "6079382880"; google_ad_width = 336; google_ad_height = 280; //--> </script> <script type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script> <script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script> <script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script> <ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 336px; PADDING-RIGHT: 0pt; DISPLAY: inline-table; HEIGHT: 280px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 336px; PADDING-RIGHT: 0pt; DISPLAY: block; HEIGHT: 280px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><iframe style="POSITION: absolute; TOP: 0pt; LEFT: 0pt" id=google_ads_frame1 height=280 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7345584400661736&dt=1248257315881&lmt=1248257308&output=html&slotname=6079382880&correlator=1248257315881&url=http%3A%2F%2Fblog.chinaunix.net%2Fu2%2F67530%2Fshowart_601823.html&cb=1&cd=1&frm=0&ga_vid=2053773672.1248257318&ga_sid=1248257318&ga_hid=1939524883&flash=9.0.124&w=336&h=280&u_h=768&u_w=1024&u_ah=734&u_aw=1024&u_cd=32&u_tz=480&u_his=1&u_nplug=15&u_nmime=47&dtd=M&xpc=zzWxpFM4ja&p=http%3A//blog.chinaunix.net" frameBorder=0 width=336 allowTransparency name=google_ads_frame marginWidth=0 scrolling=no></iframe></ins></ins><!-- 騫垮憡瀹?-->NT/2000鏂規(guī)硶錛?br><br>#include <windows.h><br>#include <conio.h><br>#include <stdio.h><br><br>#define SystemBasicInformation 0<br>#define SystemPerformanceInformation 2<br>#define SystemTimeInformation 3<br><br>#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 (double)((x).LowPart))<br><br>typedef struct<br>{<br>DWORD dwUnknown1;<br>ULONG uKeMaximumIncrement;<br>ULONG uPageSize;<br>ULONG uMmNumberOfPhysicalPages;<br>ULONG uMmLowestPhysicalPage;<br>ULONG uMmHighestPhysicalPage;<br>ULONG uAllocationGranularity;<br>PVOID pLowestUserAddress;<br>PVOID pMmHighestUserAddress;<br>ULONG uKeActiveProcessors;<br>BYTE bKeNumberProcessors;<br>BYTE bUnknown2;<br>WORD wUnknown3;<br>} SYSTEM_BASIC_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liIdleTime;<br>DWORD dwSpare[76];<br>} SYSTEM_PERFORMANCE_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liKeBootTime;<br>LARGE_INTEGER liKeSystemTime;<br>LARGE_INTEGER liExpTimeZoneBias;<br>ULONG uCurrentTimeZoneId;<br>DWORD dwReserved;<br>} SYSTEM_TIME_INFORMATION;<br><br><br>// ntdll!NtQuerySystemInformation (NT specific!)<br>//<br>// The function copies the system information of the<br>// specified type into a buffer<br>//<br>// NTSYSAPI<br>// NTSTATUS<br>// NTAPI<br>// NtQuerySystemInformation(<br>// IN UINT SystemInformationClass, // information type<br>// OUT PVOID SystemInformation, // pointer to buffer<br>// IN ULONG SystemInformationLength, // buffer size in bytes<br>// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit<br>// // variable that receives<br>// // the number of bytes<br>// // written to the buffer <br>// );<br>typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);<br><br>PROCNTQSI NtQuerySystemInformation;<br><br><br>void main(void)<br>{<br>SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;<br>SYSTEM_TIME_INFORMATION SysTimeInfo;<br>SYSTEM_BASIC_INFORMATION SysBaseInfo;<br>double dbIdleTime;<br>double dbSystemTime;<br>LONG status;<br>LARGE_INTEGER liOldIdleTime = {0,0};<br>LARGE_INTEGER liOldSystemTime = {0,0};<br><br>NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(<br>GetModuleHandle("ntdll"),<br>"NtQuerySystemInformation"<br>);<br><br>if (!NtQuerySystemInformation)<br>return;<br><br>// get number of processors in the system<br>status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>// get new system time<br>status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);<br>if (status!=NO_ERROR)<br>return;<br><br>// get new CPU's idle time<br>status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br><span id="hvzpftn" class=sp874>// 鏈枃杞嚜 C Builder鐮旂┒ - http://www.ccrun.com/article.asp?i=424&d=7jw23a</span><br>// if it's a first call - skip it<br>if (liOldIdleTime.QuadPart != 0)<br>{<br>// CurrentValue = NewValue - OldValue<br>dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);<br>dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);<br><br>// CurrentCpuIdle = IdleTime / SystemTime<br>dbIdleTime = dbIdleTime / dbSystemTime;<br><br>// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors<br>dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;<br><br>printf("\b\b\b\b=%%",(UINT)dbIdleTime);<br>}<br><br>// store new CPU's idle and system time<br>liOldIdleTime = SysPerfInfo.liIdleTime;<br>liOldSystemTime = SysTimeInfo.liKeSystemTime;<br><br>// wait one second<br>Sleep(1000);<br>}<br>printf("\n");<br>}<br><br>//-------------------------------------------------------------<br><br>W9X:<br>#include <windows.h><br>#include <conio.h><br>#include <stdio.h><br><br>void main(void)<br>{<br>HKEY hkey;<br>DWORD dwDataSize;<br>DWORD dwType;<br>DWORD dwCpuUsage;<br><br>// starting the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StartStat",<br>0,KEY_ALL_ACCESS,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br><br>RegCloseKey(hkey);<br><br>// geting current counter's value<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StatData",<br>0,KEY_READ,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br>Sleep(500);<br>printf("\b\b\b\b=%%",dwCpuUsage);<br>}<br>printf("\n");<br><br>RegCloseKey(hkey);<br><br>// stoping the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StopStat",<br>0,KEY_ALL_ACCESS,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br><br>RegCloseKey(hkey);<br>} <script type=text/javascript><!-- google_ad_client = "pub-7345584400661736"; /* 728x15, 鍒涘緩浜?08-4-7涓璧風編瀹癸紙鏂囧瓧閾炬帴錛?*/ google_ad_slot = "6959625474"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script> <ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 728px; PADDING-RIGHT: 0pt; DISPLAY: inline-table; HEIGHT: 15px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 728px; PADDING-RIGHT: 0pt; DISPLAY: block; HEIGHT: 15px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><iframe style="POSITION: absolute; TOP: 0pt; LEFT: 0pt" id=google_ads_frame2 height=15 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7345584400661736&dt=1248257318006&lmt=1248257308&prev_slotnames=6079382880&output=html&slotname=6959625474&correlator=1248257315881&url=http%3A%2F%2Fblog.chinaunix.net%2Fu2%2F67530%2Fshowart_601823.html&cb=1&cd=1&frm=0&ga_vid=2053773672.1248257318&ga_sid=1248257318&ga_hid=1939524883&flash=9.0.124&w=728&h=15&u_h=768&u_w=1024&u_ah=734&u_aw=1024&u_cd=32&u_tz=480&u_his=1&u_nplug=15&u_nmime=47&dtd=4&xpc=ivcWVwcBPa&p=http%3A//blog.chinaunix.net" frameBorder=0 width=728 allowTransparency name=google_ads_frame marginWidth=0 scrolling=no></iframe></ins></ins>NT/2000鏂規(guī)硶錛?br><br>#include <windows.h><br>#include <conio.h><br>#include <stdio.h><br><br>#define SystemBasicInformation 0<br>#define SystemPerformanceInformation 2<br>#define SystemTimeInformation 3<br><br>#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 (double)((x).LowPart))<br><br>typedef struct<br>{<br>DWORD dwUnknown1;<br>ULONG uKeMaximumIncrement;<br>ULONG uPageSize;<br>ULONG uMmNumberOfPhysicalPages;<br>ULONG uMmLowestPhysicalPage;<br>ULONG uMmHighestPhysicalPage;<br>ULONG uAllocationGranularity;<br>PVOID pLowestUserAddress;<br>PVOID pMmHighestUserAddress;<br>ULONG uKeActiveProcessors;<br>BYTE bKeNumberProcessors;<br>BYTE bUnknown2;<br>WORD wUnknown3;<br>} SYSTEM_BASIC_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liIdleTime;<br>DWORD dwSpare[76];<br>} SYSTEM_PERFORMANCE_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liKeBootTime;<br>LARGE_INTEGER liKeSystemTime;<br>LARGE_INTEGER liExpTimeZoneBias;<br>ULONG uCurrentTimeZoneId;<br>DWORD dwReserved;<br>} SYSTEM_TIME_INFORMATION;<br><br><br>// ntdll!NtQuerySystemInformation (NT specific!)<br>//<br>// The function copies the system information of the<br>// specified type into a buffer<br>//<br>// NTSYSAPI<br>// NTSTATUS<br>// NTAPI<br>// NtQuerySystemInformation(<br>// IN UINT SystemInformationClass, // information type<br>// OUT PVOID SystemInformation, // pointer to buffer<br>// IN ULONG SystemInformationLength, // buffer size in bytes<br>// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit<br>// // variable that receives<br>// // the number of bytes<br>// // written to the buffer <br>// );<br>typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);<br><br>PROCNTQSI NtQuerySystemInformation;<br><br><br>void main(void)<br>{<br>SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;<br>SYSTEM_TIME_INFORMATION SysTimeInfo;<br>SYSTEM_BASIC_INFORMATION SysBaseInfo;<br>double dbIdleTime;<br>double dbSystemTime;<br>LONG status;<br>LARGE_INTEGER liOldIdleTime = {0,0};<br>LARGE_INTEGER liOldSystemTime = {0,0};<br><br>NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(<br>GetModuleHandle("ntdll"),<br>"NtQuerySystemInformation"<br>);<br><br>if (!NtQuerySystemInformation)<br>return;<br><br>// get number of processors in the system<br>status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>// get new system time<br>status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);<br>if (status!=NO_ERROR)<br>return;<br><br>// get new CPU's idle time<br>status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br><span id="hvzpftn" class=sp874>// 鏈枃杞嚜 C Builder鐮旂┒ - http://www.ccrun.com/article.asp?i=424&d=7jw23a</span><br>// if it's a first call - skip it<br>if (liOldIdleTime.QuadPart != 0)<br>{<br>// CurrentValue = NewValue - OldValue<br>dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);<br>dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);<br><br>// CurrentCpuIdle = IdleTime / SystemTime<br>dbIdleTime = dbIdleTime / dbSystemTime;<br><br>// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors<br>dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;<br><br>printf("\b\b\b\b=%%",(UINT)dbIdleTime);<br>}<br><br>// store new CPU's idle and system time<br>liOldIdleTime = SysPerfInfo.liIdleTime;<br>liOldSystemTime = SysTimeInfo.liKeSystemTime;<br><br>// wait one second<br>Sleep(1000);<br>}<br>printf("\n");<br>}<br><br>//-------------------------------------------------------------<br><br>W9X:<br>#include <windows.h><br>#include <conio.h><br>#include <stdio.h><br><br>void main(void)<br>{<br>HKEY hkey;<br>DWORD dwDataSize;<br>DWORD dwType;<br>DWORD dwCpuUsage;<br><br>// starting the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StartStat",<br>0,KEY_ALL_ACCESS,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br><br>RegCloseKey(hkey);<br><br>// geting current counter's value<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StatData",<br>0,KEY_READ,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br>Sleep(500);<br>printf("\b\b\b\b=%%",dwCpuUsage);<br>}<br>printf("\n");<br><br>RegCloseKey(hkey);<br><br>// stoping the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StopStat",<br>0,KEY_ALL_ACCESS,<br>&hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&dwType,<br>(LPBYTE)&dwCpuUsage,<br>&dwDataSize );<br><br>RegCloseKey(hkey);<br>} <img src ="http://m.shnenglu.com/guying2008/aggbug/90850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 18:11 <a href="http://m.shnenglu.com/guying2008/archive/2009/07/22/90850.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Generic Observer Pattern and Events in C++http://m.shnenglu.com/guying2008/archive/2009/07/22/90831.htmlyanghaibaoyanghaibaoWed, 22 Jul 2009 06:51:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/07/22/90831.htmlIntroduction

One of the interesting features I found in C# is a 錕紼vents and Delegates錕?concept. The idea is good but not new in Object Oriented Programming, it is one of the most frequently used concepts in programming, sometimes referred to as 錕絆bserver錕?or 錕紻ocument/View錕?design pattern. Classical formulation of it could be found in 錕紻esign Patterns, Elements of Reusable Object Oriented Software錕?by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides (The Gang of Four).

This concept is used when you want some information stored in one object, called 錕絤odel錕?(subject) to be watched by others, called 錕絭iews錕?(observers). Each time when information is changed in the 錕絤odel錕? 錕絭iews錕?attached to the model should receive notification and update there states accordingly to the changed 錕絤odel錕?

Classical implementation described in 錕紻esign Patterns錕?

As it is seen from the class diagram, concrete models should be derived from Subject class and views from Observer. Any time the state of Subject is changed, it calls notify method which notifies all observers attached to the Subject.

Collapse Copy Code
void Subject::notify()
{
for(int i=0; i<observes.size(); i++)
observers[i]->update();
}

In many applications, this straightforward implementation is good enough, but things are getting ugly when you have different kinds of changes in the 錕絪ubject錕?and you want to pass different types of parameters to the 錕絭iews錕?

One of the examples for complex 錕組odel錕?錕絍iew錕?relations is a GUI control attached to its processing function. Each time the control錕絪 state is changed, process function is called with parameters indicating new state of the control.

These kinds of problems are solved in C# by the introduction of 錕紼vents and Delegates錕?concept. The resolution of the problem is easier in C#, because all classes are inherited from the same 錕給bject錕?class.

At the beginning, I thought why we do not have this nice 錕紼vents and Delegates錕?thing in standard C++, but then I came to the conclusion that C++ does not need it.

C++ language is powerful enough to express 錕紼vents錕?and 錕紻elegates錕?concept in terms of already existing primitives. Proposed design makes it possible to "connect" different methods with different number of parameters belonging to unrelated classes to the 錕絤odel錕?

The keys for this solution are C++ templates (generic types) and pointes to member functions.

Using Code

Suppose we have a class MySubject that has internal information connected to different views, it produces three different types of events called int_event, double_event and triple_event with different types and numbers of parameters.

Collapse Copy Code
class MySubject
{
public:
CppEvent1<bool,int> int_event;
CppEvent2<bool,double,int> double_event;
CppEvent3<bool,double,int,const char*> triple_event;
void submit_int()
{
int_event.notify(1);
}
void submit_double()
{
double_event.notify(10.5,100);
}
void submit_triple()
{
triple_event.notify(10.5,100,"Oh ye");
}
};

Views represented by MyListener1 and MyListener2 are unrelated. The only requirement is for callback (delegate) methods to have parameters signature similar to corresponding CppEvent.

Collapse Copy Code
class MyListener1
{
public:
bool update_int(int p)
{
Console::WriteLine(S"int update listener 1");
return true;
}
bool update_double(double p,int p1)
{
Console::WriteLine(S"double update listener 1");
return true;
}
bool update_triple(double p,int p1,const char* str)
{
Console::WriteLine(S"triple update listener 1");
return true;
}
};
class MyListener2
{
public:
bool fun(int p)
{
Console::WriteLine(S"int update listener 2");
return true;
}
};

The final step is to create viewers MyListener1 and MyListener2 and connect their member functions to corresponding events in MySubject model.

Collapse Copy Code
int main(void)
{
// create listeners (viewers)
    MyListener1* listener1 = new MyListener1;
MyListener2* listener2 = new MyListener2;
// create model
    MySubject subject;
// connect different viewers to different events of the model
    CppEventHandler h1 = subject.int_event.attach(listener1,
&MyListener1::update_int);
CppEventHandler h2 = subject.int_event.attach(listener2,
&MyListener2::fun);
CppEventHandler h3 = subject.double_event.attach(listener1,
&MyListener1::update_double);
CppEventHandler h4 = subject.triple_event.attach(listener1,
&MyListener1::update_triple);
// generate events
    subject.submit_int();
subject.submit_double();
subject.submit_triple();
// detach handlers
    subject.int_event.detach(h1);
subject.int_event.detach(h2);
subject.double_event.detach(h3);
subject.triple_event.detach(h4);
return 0;
}

Resulting output is:

Collapse Copy Code
> int update listener 1
> int update listener 2
> double update listener 1
> triple update listener 1

Implementation

First of all, if we want to attach different types of event handles (member functions with same types of parameters from different classes) to the same event, we should provide common base for them. We use templates to make it generic for any combination of parameter types in 錕絛elegate錕?or call back method. There are different event types for every number of arguments in callback function.

Collapse Copy Code
// Event handler base for delegate with 1 parameter
template <typename ReturnT,typename ParamT>
class EventHandlerBase1
{
public:
virtual ReturnT notify(ParamT param) = 0;
};

Specific type of member function pointer within a pointer to the object is stored in the derived class.

Collapse Copy Code
template <typename ListenerT,typename ReturnT,typename ParamT>
class EventHandler1 : public EventHandlerBase1<ReturnT,ParamT>
{
typedef ReturnT (ListenerT::*PtrMember)(ParamT);
ListenerT* m_object;
PtrMember m_member;
public:
EventHandler1(ListenerT* object, PtrMember member)
: m_object(object), m_member(member)
{}
ReturnT notify(ParamT param)
{
return (m_object->*m_member)(param);
}
};

Event class stores map of event handlers and notifies all of them when notify method is called. Detach method is used to release handler from the map.

Collapse Copy Code
template <typename ReturnT,typename ParamT>
class CppEvent1
{
typedef std::map<int,EventHandlerBase1<ReturnT,ParamT> *> HandlersMap;
HandlersMap m_handlers;
int m_count;
public:
CppEvent1()
: m_count(0) {}
template <typename ListenerT>
CppEventHandler attach(ListenerT* object,ReturnT (ListenerT::*member)(ParamT))
{
typedef ReturnT (ListenerT::*PtrMember)(ParamT);
m_handlers[m_count] = (new EventHandler1<ListenerT,
ReturnT,ParamT>(object,member));
m_count++;
return m_count-1;
}
bool detach(CppEventHandler id)
{
HandlersMap::iterator it = m_handlers.find(id);
if(it == m_handlers.end())
return false;
delete it->second;
m_handlers.erase(it);
return true;
}
ReturnT notify(ParamT param)
{
HandlersMap::iterator it = m_handlers.begin();
for(; it != m_handlers.end(); it++)
{
it->second->notify(param);
}
return true;
}
};

Comments

This implementation is quite similar to those in the article 錕紼mulating C# delegates in Standard C++錕?/font>. I found out it after I already wrote the article. Actually, the fact that we have a similar way to deal with the problem means that it錕絪 a very intuitive solution for this kind of problem in C++. An advantage of the current implementation is that it supports different number of arguments, so any member function of any class could be a callback (delegate). Probably to have this thing as a part of standard library is a good thing, but even if it錕絪 not a part of the standard, you can use it as it is. This implementation is restricted to events up to 3 parameters, it can be easily extended to other numbers by just rewriting it with different number of parameters (see code for details).

License



]]>
璁捐妯″紡瑙f瀽鍜屽疄鐜?C++) Observer 妯″紡http://m.shnenglu.com/guying2008/archive/2009/07/22/90830.htmlyanghaibaoyanghaibaoWed, 22 Jul 2009 06:44:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/07/22/90830.html浣滅敤錛?

瀹氫箟瀵硅薄闂寸殑涓縐嶄竴瀵瑰鐨勪緷璧栧叧緋伙紝褰撲竴涓璞$殑鐘舵佸彂鐢熸敼鍙樻椂錛屾墍鏈変緷璧栦簬瀹冪殑瀵硅薄閮藉緱鍒伴氱煡騫惰鑷姩鏇存柊銆?/p>

UML緇撴瀯鍥撅細

 

瑙f瀽錛?/p>

Observer妯″紡瀹氫箟鐨勬槸涓縐嶄竴瀵瑰鐨勫叧緋伙紝榪欓噷鐨勪竴灝辨槸鍥句腑鐨凷ubject綾伙紝鑰屽鍒欐槸Obesrver綾伙紝褰揝ubject綾葷殑鐘舵佸彂鐢熷彉鍖栫殑鏃跺欓氱煡涓庝箣瀵瑰簲鐨凮besrver綾諱滑涔熷幓鐩稿簲鐨勬洿鏂扮姸鎬侊紝鍚屾椂鏀寔鍔ㄦ佺殑娣誨姞鍜屽垹闄bserver瀵硅薄鐨勫姛鑳姐侽besrver妯″紡鐨勫疄鐜拌鐐規(guī)槸錛岀涓涓鑸瑂ubject綾婚兘鏄噰鐢ㄩ摼琛ㄧ瓑瀹瑰櫒鏉ュ瓨鏀綩bserver瀵硅薄錛岀浜屾娊鍙栧嚭Observer瀵硅薄鐨勪竴浜涘叕鍏辯殑灞炴у艦鎴怬bserver鍩虹被錛岃孲ubject涓繚瀛樼殑鍒欐槸Observer綾誨璞$殑鎸囬拡錛岃繖鏍峰氨浣縎ubject鍜屽叿浣撶殑Observer瀹炵幇浜嗚В鑰︼紝涔熷氨鏄疭ubject涓嶉渶瑕佸幓鍏沖績鍒板簳鏄摢涓狾bserver瀵規(guī)斁榪涗簡鑷繁鐨勫鍣ㄤ腑銆傜敓媧諱腑鏈夊緢澶氫緥瀛愬彲浠ョ湅鍋氭槸Observer妯″紡鐨勮繍鐢紝姣旀柟璇達紝涓涓彮鏈変竴涓彮涓諱換錛圫ubject錛夛紝浠栫鐞嗘墜涓嬬殑涓甯鐢燂紙Observer錛夛紝褰撶彮閲屾湁涓浜涗簨鎯呭彂鐢熼渶瑕侀氱煡瀛︾敓鐨勬椂鍊欙紝鐝富浠昏鍋氱殑涓嶆槸閫愪釜瀛︾敓鎸ㄤ釜鐨勯氱煡鑰屾槸鎶婂鐢熷彫闆嗚搗鏉ヤ竴璧烽氱煡錛屽疄鐜頒簡鐝富浠誨拰鍏蜂綋瀛︾敓鐨勫叧緋昏В鑰︺?/p>

瀹炵幇錛?/p>

1錛塐bserver.h

/**//********************************************************************
銆銆銆 created:銆銆銆 2006/07/20
銆銆銆 filename:銆銆銆銆 Observer.h
銆銆銆 author:銆銆銆銆銆銆銆 鏉庡垱
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 http://m.shnenglu.com/converse/

銆銆銆 purpose:銆銆銆 Observer妯″紡鐨勬紨紺轟唬鐮?br>*********************************************************************/

#ifndef OBSERVER_H
#define OBSERVER_H

#include <list>

typedef int STATE;

class Observer;

// Subject鎶借薄鍩虹被,鍙渶瑕佺煡閬揙bserver鍩虹被鐨勫0鏄庡氨鍙互浜?br>class Subject
{
public:
銆銆銆 Subject() : m_nSubjectState(-1){}
銆銆銆 virtual ~Subject();

銆銆銆 void Notify();銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 // 閫氱煡瀵硅薄鏀瑰彉鐘舵?br>銆銆銆 void Attach(Observer *pObserver);銆銆銆銆銆銆銆 // 鏂板瀵硅薄
銆銆銆 void Detach(Observer *pObserver);銆銆銆銆銆銆銆 // 鍒犻櫎瀵硅薄

銆銆銆 // 铏氬嚱鏁?鎻愪緵榛樿鐨勫疄鐜?媧劇敓綾誨彲浠ヨ嚜宸卞疄鐜版潵瑕嗙洊鍩虹被鐨勫疄鐜?br>銆銆銆 virtual void銆銆銆 SetState(STATE nState);銆銆銆 // 璁劇疆鐘舵?br>銆銆銆 virtual STATE銆銆銆 GetState();銆銆銆銆銆銆銆 // 寰楀埌鐘舵?/p>

protected:
銆銆銆 STATE m_nSubjectState;銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 // 妯℃嫙淇濆瓨Subject鐘舵佺殑鍙橀噺
銆銆銆 std::list<Observer*>銆銆銆 m_ListObserver;銆銆銆 // 淇濆瓨Observer鎸囬拡鐨勯摼琛?br>};

// Observer鎶借薄鍩虹被
class Observer
{
public:
銆銆銆 Observer() : m_nObserverState(-1){}
銆銆銆 virtual ~Observer(){}

銆銆銆 // 綰櫄鍑芥暟,鍚勪釜媧劇敓綾誨彲鑳芥湁涓嶅悓鐨勫疄鐜?br>銆銆銆 // 閫氱煡Observer鐘舵佸彂鐢熶簡鍙樺寲
銆銆銆 virtual void Update(Subject* pSubject) = 0;

protected:
銆銆銆 STATE m_nObserverState;銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 // 妯℃嫙淇濆瓨Observer鐘舵佺殑鍙橀噺
};

// ConcreateSubject綾?媧劇敓鍦⊿ubject綾?br>class ConcreateSubject
銆銆銆 : public Subject
{
public:
銆銆銆 ConcreateSubject() : Subject(){}
銆銆銆 virtual ~ConcreateSubject(){}

銆銆銆 // 媧劇敓綾昏嚜宸卞疄鐜版潵瑕嗙洊鍩虹被鐨勫疄鐜?br>銆銆銆 virtual void銆銆銆 SetState(STATE nState);銆銆銆 // 璁劇疆鐘舵?br>銆銆銆 virtual STATE銆銆銆 GetState();銆銆銆銆銆銆銆 // 寰楀埌鐘舵?/p>

};

// ConcreateObserver綾繪淳鐢熻嚜Observer
class ConcreateObserver
銆銆銆 : public Observer
{
public:
銆銆銆 ConcreateObserver() : Observer(){}
銆銆銆 virtual ~ConcreateObserver(){}

銆銆銆 // 铏氬嚱鏁?瀹炵幇鍩虹被鎻愪緵鐨勬帴鍙?br>銆銆銆 virtual void Update(Subject* pSubject);
};

#endif

 

2錛塐bserver.cpp

/**//********************************************************************
銆銆銆 created:銆銆銆 2006/07/20
銆銆銆 filename:銆銆銆銆 Observer.cpp
銆銆銆 author:銆銆銆銆銆銆銆 鏉庡垱
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 http://m.shnenglu.com/converse/

銆銆銆 purpose:銆銆銆 Observer妯″紡鐨勬紨紺轟唬鐮?br>*********************************************************************/

#include "Observer.h"
#include <iostream>
#include <algorithm>

/**//* --------------------------------------------------------------------
|銆銆銆 Subject綾繪垚鍛樺嚱鏁扮殑瀹炵幇
|
銆----------------------------------------------------------------------*/

void Subject::Attach(Observer *pObserver)
{
銆銆銆 std::cout << "Attach an Observern";

銆銆銆 m_ListObserver.push_back(pObserver);
}

void Subject::Detach(Observer *pObserver)
{
銆銆銆 std::list<Observer*>::iterator iter;
銆銆銆 iter = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver);

銆銆銆 if (m_ListObserver.end() != iter)
銆銆銆 {
銆銆銆銆銆銆銆 m_ListObserver.erase(iter);
銆銆銆 }

銆銆銆 std::cout << "Detach an Observern";
}

void Subject::Notify()
{
銆銆銆 std::cout << "Notify Observers''s Staten";

銆銆銆 std::list<Observer*>::iterator iter1, iter2;

銆銆銆 for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();
銆銆銆銆銆銆銆銆 iter1 != iter2;
銆銆銆銆銆銆銆銆 ++iter1)
銆銆銆 {
銆銆銆銆銆銆銆 (*iter1)->Update(this);
銆銆銆 }
}

void Subject::SetState(STATE nState)
{
銆銆銆 std::cout << "SetState By Subjectn";
銆銆銆 m_nSubjectState = nState;
}

STATE Subject::GetState()
{
銆銆銆 std::cout << "GetState By Subjectn";
銆銆銆 return m_nSubjectState;
}

Subject::~Subject()
{
銆銆銆 std::list<Observer*>::iterator iter1, iter2, temp;

銆銆銆 for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();
銆銆銆銆銆銆銆 iter1 != iter2;
銆銆銆銆銆銆銆 )
銆銆銆 {
銆銆銆銆銆銆銆 temp = iter1;
銆銆銆銆銆銆銆 ++iter1;
銆銆銆銆銆銆銆 delete (*temp);
銆銆銆 }

銆銆銆 m_ListObserver.clear();
}

/**//* --------------------------------------------------------------------
|銆銆銆 ConcreateSubject綾繪垚鍛樺嚱鏁扮殑瀹炵幇
|
----------------------------------------------------------------------*/
void ConcreateSubject::SetState(STATE nState)
{
銆銆銆 std::cout << "SetState By ConcreateSubjectn";
銆銆銆 m_nSubjectState = nState;
}

STATE ConcreateSubject::GetState()
{
銆銆銆 std::cout << "GetState By ConcreateSubjectn";
銆銆銆 return m_nSubjectState;
}

/**//* --------------------------------------------------------------------
|銆銆銆 ConcreateObserver綾繪垚鍛樺嚱鏁扮殑瀹炵幇
|
----------------------------------------------------------------------*/
void ConcreateObserver::Update(Subject* pSubject)
{
銆銆銆 if (NULL == pSubject)
銆銆銆銆銆銆銆 return;

銆銆銆 m_nObserverState = pSubject->GetState();

銆銆銆 std::cout << "The ObeserverState is " << m_nObserverState << std::endl;
}


3錛塎ain.cpp

/**//********************************************************************
銆銆銆 created:銆銆銆 2006/07/21
銆銆銆 filename:銆銆銆銆 Main.cpp
銆銆銆 author:銆銆銆銆銆銆銆 鏉庡垱
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆 http://m.shnenglu.com/converse/

銆銆銆 purpose:銆銆銆 Observer妯″紡鐨勬祴璇曚唬鐮?br>*********************************************************************/

#include "Observer.h"
#include <iostream>

int main()
{
銆銆銆 Observer *p1 = new ConcreateObserver;
銆銆銆 Observer *p2 = new ConcreateObserver;

銆銆銆 Subject* p = new ConcreateSubject;
銆銆銆 p->Attach(p1);
銆銆銆 p->Attach(p2);
銆銆銆 p->SetState(4);
銆銆銆 p->Notify();

銆銆銆 p->Detach(p1);
銆銆銆 p->SetState(10);
銆銆銆 p->Notify();

銆銆銆 delete p;

銆銆銆 system("pause");

銆銆銆 return 0;
}



]]>
Observer 妯″紡鐨勪竴縐嶅疄鐜?/title><link>http://m.shnenglu.com/guying2008/archive/2009/07/22/90824.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 05:50:00 GMT</pubDate><guid>http://m.shnenglu.com/guying2008/archive/2009/07/22/90824.html</guid><description><![CDATA[<a >http://www.codeproject.com/KB/cpp/CppEvents.aspx</a> <img src ="http://m.shnenglu.com/guying2008/aggbug/90824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 13:50 <a href="http://m.shnenglu.com/guying2008/archive/2009/07/22/90824.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>[杞澆] 緇撴瀯鎴愬憳瀵歸綈涓庡簭鍒楀寲http://m.shnenglu.com/guying2008/archive/2009/07/21/90707.htmlyanghaibaoyanghaibaoTue, 21 Jul 2009 04:26:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/07/21/90707.html

鍦ㄨ澶氬箍娉涘簲鐢ㄧ殑紼嬪簭搴擄紝鎴戜滑浼氱湅鍒扮被浼?#pragma pack(push, 4) 絳夎繖鏍風殑鏍囩ず銆傚洜涓虹敤鎴蜂細浠繪剰鏇存敼浠栦滑鐨勭粨鏋勬垚鍛樺榻愰夐」錛屽浜庡厛浜庤繖浜涘唴瀹瑰垱寤虹殑紼嬪簭搴撴潵璇達紝涓嶈兘紜繚涓瀹氱殑鍐呭瓨甯冨眬灝嗗彲鑳藉湪棰勫厛涔﹀啓鐨勪竴浜涙暟鎹闂ā鍧椾笂瀵艱嚧閿欒錛屾垨鑰呮牴鏈笉鍙兘瀹炵幇銆?br>
鎴戝湪瀹炵幇涓縐?C++ 綾葷殑瀹炰緥鐨勫簭鍒楀寲宸ュ叿鏃訛紝渚濊禆浜嗗唴瀛樺竷灞銆傛垜鐭ラ亾甯傞潰涓婂緢澶?#8220;搴忓垪鍖?#8221;宸ュ叿鍏佽鏇翠負騫挎硾鐨勯氫俊鐢ㄩ旓紝浣嗘槸瀹冧滑涔熸槸鐢ㄨ搗鏉ユ渶楹葷儲鐨勶紝鏈夊緢澶氶檺鍒舵潯浠躲傛垜瀹炵幇鐨勫簭鍒楀寲宸ュ叿鐢ㄦ剰寰堟槑鏄撅紝涓虹壒瀹氳繍琛屾ā鍧楁彁渚涗究鎹烽珮鏁堢殑鎸佷箙鍖栧瓨鍌ㄨ兘鍔涖?br>
涓轟簡鎻愪緵鎰熸х殑璁よ瘑錛屾彁渚涗簡涓涓嬌鐢ㄨ繖涓簭鍒楀寲宸ュ叿鐨勭被鍨嬪畾涔夈?br>
class StorageDoc
: public SerialOwner
{
public:
Serializable(StorageDoc);

char c;
int i;
SerialString str;
};

瀹冪戶鎵胯嚜 SerialOwner錛屽畠澹版槑浜?Serializable錛岄殣鍚潃瀹炵幇浜嗕竴浜涙帴鍙o紝涓哄熀綾昏闂綋鍓嶇被鍨嬩俊鎭彁渚涘府鍔┿傝繖鏄緝鏃╀功鍐欑殑涓縐嶆柟妗堬紝鐜板湪鎴戜細鏀圭敤妯℃澘浠ヤ究鍦ㄧ紪璇戞椂寤虹珛綾誨瀷淇℃伅錛屼笉榪囧師鐞嗗畬鍏ㄤ竴鏍楓?br>
鐜板湪錛孲torageDoc 褰撲腑鐨勫唴瀛樺竷灞闇瑕佸彲紜畾鐨勶紝浣嗘槸鐢ㄦ埛浼氶夋嫨涓嶅悓鐨勭粨鏋勬垚鍛樺榻愰夐」錛屼負姝ら渶瑕佽瀹氫竴涓粨鏋勬垚鍛樺榻愮殑“瀛愬煙”錛屽畬鎴愯繖欏硅兘鍔涚殑浼寚浠ゆ槸 #pragma pack銆?br>
#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n )

1錛夊綋閫夌敤 show錛屽垯娣誨姞涓鏉¤鍛婁俊鎭紝鎸囩ず褰撳墠緙栬瘧鍩熷唴鐨勫榻愬睘鎬?br>2錛変粎浠呰緗?n錛屽垯閲嶅啓緙栬瘧鍣ㄩ夐」 /Zp錛屽茍褰卞搷鍒版澹版槑浠ヤ笅鐨勫悓涓涓紪璇戝崟鍏冨唴鐨勬墍鏈夌粨鏋勫畾涔?br>3錛塸ush 浠ュ強 pop 綆$悊浜嗕竴緇?#8220;瀛愬煙”鍫嗘爤錛屽彲浠ヤ笉鏂姞娣卞祵濂?br>4錛塱dentifier 鍛藉悕浜嗗爢鏍堜笂鐨勫榻愰」錛屼互渚垮湪鐗瑰畾闇姹備腑寮瑰嚭鍚堥傜殑欏圭洰

浠ヤ笅鏄嬌鐢ㄧ殑娉ㄦ剰浜嬮」錛?br>
1錛変笉璁轟綍鏃訛紝#pragma pack() 鎬繪槸鎭㈠鍒?/Zp 鐨勯璁懼鹼紝鍗充嬌澶勪簬 push 鐨?#8220;瀛愬煙”
2錛?pragma pack(push) 鏈寚瀹氬榻愬鹼紝鍒欎笉鏀瑰彉
3錛?pragma pack(pop) 鍙寚瀹氬榻愬煎嚭鏍堝悗鐨勮緗鹼紝鑻ヤ笉鎸囧畾鍒欐寜宓屽絳夌駭榪樺師錛岀洿鑷?/Zp 棰勮鍊?br>
緇間笂錛?pragma pack(pop) 鎬繪槸鑳芥紜洖閫鍒頒笂涓涓綔鐢ㄥ煙錛屼笉綆¤浣滅敤鍩熼氳繃 #pragma pack(n) 澹版槑鎴栬?#pragma pack(push, n)銆傝?#pragma pack() 鎬繪槸鍙栭璁懼箋傚浜庣敤鎴蜂簨鍏堟寚瀹氫簡涓涓?#8220;瀛愬煙”錛屽茍鍦ㄥ叾涓紩鍏ヤ簡涓涓嬌鐢?#pragma pack(n) - #pragma pack() 瀵硅岄潪鍫嗘爤褰㈠紡鏉ュ0鏄庡眬閮ㄧ粨鏋勬垚鍛樺榻愮殑澶存枃浠訛紝浼氫嬌鐢ㄦ埛闈炲父鍥版儜銆?d3d9types.h> 灝辨槸榪欐牱鍋氱殑銆?br>
褰撴垜浠負紼嬪簭搴撶紪璇戣繍琛屾椂錛屾湁涓浜涚被鍨嬭姹備弗鏍煎湴閬靛畧鍐呭瓨甯冨眬錛屾瘮濡備竴浜涚‖浠跺厑璁告垜浠紶鍏ョ殑鏁版嵁灝遍渶瑕佽繖涔堝仛錛屽氨鍙互鎶婂畠浠檺瀹氳搗鏉ワ細

#pragma pack(push, 8)

#include "Chain.h"
#include "ByteQueue.h"
#include "SerialOwner.h"
#include "SerialUser.h"
#include "SerialString.h"
#include "SerialStream.h"

#pragma pack(pop)

浜嬫儏鍐嶅洖鍒板簭鍒楀寲涓婇潰錛岀敤鎴蜂細澶氭灝濊瘯緙栬瘧浠栦滑鐨勫簭鍒楀寲搴旂敤妯″潡錛屽茍鎸囨湜鍓嶄竴嬈$紪璇戜箣鍚庤繍琛屾墍浜х敓鐨勬枃浠朵粛鐒舵槸鍙敤鐨勶紝鎵浠ヨ繕闇瑕佸湪鐢ㄦ埛鏂囦歡褰撲腑鏄庣‘鎵閫夌敤鐨勫榻愬鹼紝騫朵竴鏃︾‘瀹氬氨涓嶅啀鏇存敼錛?br>
#pragma pack(push, 8)
class StorageDoc
: public SerialOwner
{
public:
Serializable(StorageDoc);

char c;
int i;
SerialString str;
};
#pragma pack(pop)

騫朵嬌鐢ㄥ畠浠細

StorageDoc doc;

doc.Load(t("doc.bin"));
std::cout << doc.str.Get() << std::endl;

doc.str = ss.str();
std::cout << doc.str.Get() << std::endl;
doc.Save(t("doc.bin"));

榪欏氨鏄叏閮ㄤ簡錛屼絾鏄濡備互涓婃彁鍒扮殑錛屼笉浠呬粎鍦ㄥ簭鍒楀寲涓婏紝鍜岀‖浠躲侀摼鎺ュ簱鐨勯氫俊涔熷彲鑳藉瓨鍦ㄤ弗鏍肩殑鍐呭瓨甯冨眬鐨勮姹傦紝濡傛灉浣犲湪欏圭洰璁捐涓婇伃閬囪繖浜涘洶鎯戯紝閭d箞鐜板湪灝卞彲浠ョ珛鍗沖姩鎵嬭В鍐沖畠浠?br>
濡傛灉瀵規(guī)湰鏂囨彁鍒扮殑搴忓垪鍖栬兘鍔涙劅鍏磋叮鐨勮瘽錛屽彲浠ュ埌浠ヤ笅閾炬帴浜嗚В璇︽儏錛?br>
http://code.google.com/p/los-lib/source/browse/

鐩綍鏄細

svn/trunk/Inc/Los/

鏂囦歡鍒嗗埆鏄細

_ISerialUser.h
ByteQueue.h
Chain.h
Serialization.h
SerialOwner.h
SerialStream.h
SerialString.h
SerialUser.h

涓嶈繃鍦ㄦ湰鏂囧彂甯冧箣鏃訛紝浠ヤ笂鏂囦歡鎵澶勭増鏈病鏈夐拡瀵圭粨鏋勬垚鍛樺榻愰夐」榪涜淇敼錛屼絾騫朵笉褰卞搷闃呰銆?br>
* 琛ュ厖涓錛?009-1-18 02:41錛?br>
鑱斿悎浠ュ強緇撴瀯鐨勭粨鏋勬垚鍛樺榻愬紓甯?br>
class Tick
{
static int _StaticID;

__int64 _StartLI; // __alignof(LARGE_INTEGER) != __alignof(__int64)
__int64 _CurrentLI;
__int64 _Frequency;

int _ID;
clock_t _Start;
clock_t _Current;

bool _Stop;
bool _HighPerformance;
...
}

LARGE_INTEGER 鏄垎鍒搴斾袱涓?32bit 浠ュ強涓涓?64bit 綾誨瀷鐨勮仈鍚堬紝濂囨殑鏄殢鐫鍏ㄥ眬瀵歸綈閫夐」鐨勪慨鏀癸紝LARGE_INTEGER 綾誨瀷鏈韓鐨勮姹傚榻?__alignof(LARGE_INTEGER) 灝嗗彇鑱斿悎鐨勬垚鍛樼殑鏈澶ц呭悓鍏ㄥ眬瀵歸綈閫夐」鐨勬渶灝忓鹼紝涔熷氨鏄錛屽綋 /Zp 璁劇疆涓?2錛岄偅涔?LARGE_INTEGER 涔熷皢浠呮壙璇哄湪 2 瀛楄妭杈圭晫涓婂榻愶紝澶氫箞涓嶅垢鍟娿傚綋鐒跺鏋滃皢榪欎釜綾誨瀷綰沖叆 #pragma pack 鐨勯檺瀹氬煙閭e氨浠涔堥棶棰橀兘娌℃湁浜嗭紝涓嶇鑱斿悎鐨勫榻愮畻娉曞涔堢殑鍙ゆ紝鍙淇濊瘉涓嶄慨鏀規(guī)墍闇鐨勫榻愬奸偅灝嗘繪槸鑳借幏寰楃‘瀹氱殑鍐呭瓨甯冨眬銆?br>
涓嶈繃姝e涓婇潰鐨勪唬鐮佸垪鍑虹殑錛屾垜浣跨敤浜?__int64 浠f浛浜?LARGE_INTEGER 鐨勫伐浣滐紝騫跺湪璇鋒眰 Win32 API 鐨勬帴鍙d笂寮哄埗鎸囬拡杞瀷錛屼嬌鐢ㄧ殑鏃跺欎害濡傛錛屼絾鑻ヨ闂仈鍚堟垚鍛樺垰濂戒負 __int64 綾誨瀷鍒欑洿鎺ヤ嬌鐢ㄤ究鍙傝繖縐嶆柟寮忔病鏈夎幏寰楅澶栫殑濂藉錛岀畻鏄竴縐嶆姉璁殑琛屼負錛屽茍涓旇鍚庢潵鐨勯槄璇昏呮湁鏈轟細浜嗚В鍒拌繖涓涓嶅緱鍏夌殑闂銆?br>
_HighPerformance = ::QueryPerformanceFrequency((LARGE_INTEGER*)&_Frequency) != 0;

褰撶劧浣滀負涓ヨ們鐨勪唬鐮佸啓浣滆咃紝涔熻浣犲皢鍦ㄤ笉姝竴澶勪嬌鐢ㄥ埌 LARGE_INTEGER錛屼負姝ゆ垜涔熶笉鎷掔粷浣跨敤濡備笅鏍煎紡錛?br>
#pragma pack(push, 8)
#include
#pragma pack(pop)

瀹冨彲淇濊瘉浣犱竾鏃犱竴澶便?br>
浣滀負瀵規(guī)瘮錛孎ILETIME 鏈夊涓嬪畾涔夛細

typedef struct _FILETIME
{
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME;

涓斾笉璁哄畠鎵闇鐨勫彲鑳界殑鏈澶х粨鏋勬垚鍛樺榻愪負 4錛屽畠涔熷皢浼撮殢鐫 /Zp 鐨勬洿鏀硅屽彉鍔ㄣ傚洜姝わ紝鍦ㄤ笉鍚岀殑閫夐」鐨勫獎鍝嶄笅錛?br>
__alignof(LARGE_INTEGER) != __alignof(FILETIME) != __alignof(__int64)

鏈変簺浜哄彲鑳借鎸囪矗浼氬彂鐢熻繖鏍風殑闂綰補鏄敤鎴峰湪鐜╁紕“緇撴瀯鎴愬憳瀵歸綈閫夐」”鑰屽鑷寸殑錛屾垜鐪熷笇鏈涗粬鑳藉璇諱竴璇昏繖綃囨枃绔犮?br>
* 琛ュ厖浜岋紙2009-1-18 02:41錛?br>
D3D 涓庣敤鎴峰畾涔夌粨鏋勭殑鍗忚皟

class VertexXYZ_N_T1
{
public:
float x, y, z;
float normal_x, normal_y, normal_z;
float u, v;
DeviceBitmap* bitmap;
Material* material;
float temp_val;

static const int FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
};

榪欐槸涓涓嚜瀹氫箟欏剁偣緇撴瀯錛屽畠鐨勬渶澶ф垚鍛樺瓧鑺傛暟涓?4錛屾墍鏈夌殑鎴愬憳涔熼兘鏄?4 瀛楄妭杈圭晫錛屼笉璁轟綔浣曢夐」錛屽緇堜繚鎸佺揣鍑戝瓨鍌紝鑻ュ叾涓竴涓垚鍛樻墿灞曚負 8 瀛楄妭錛岄偅涔堜即闅忕潃閫夐」鐨勬洿鏀癸紝VertexXYZ_N_T1 瑕佹眰鐨勫榻愯竟鐣屽彲瀵艱嚧閮ㄥ垎絀烘礊錛屼粠鑰屽悓紜歡鎵闇鐨勯《鐐圭紦瀛樻暟鎹竷灞瀛樺湪鍑哄叆錛屾垜涓嶈拷絀剁‖浠舵槸鍚︿嬌鐢?double 鍊鹼紝浣嗘槸鐜板湪灝卞簲褰撲嬌鐢?br>
#pragma pack(push, 4)
...
#pragma pack(pop)

鍔犱互闄愬畾銆?br>
鎴戣繕瀹氫箟浜?Matrix, Material, Vector3, Colorf 絳夌被鍨嬶紝濡傛灉瑕佷嬌寰楄繖浜涙暟鎹悓 D3D, D3DX 鐨勭浉搴旂被鍨嬪湪鍐呭瓨涓婂吋瀹圭殑錛屼篃鏄渶瑕侀檺瀹氱殑銆?/p>

]]>
#pragma pack() 鍜宻izeof http://m.shnenglu.com/guying2008/archive/2009/07/21/90700.htmlyanghaibaoyanghaibaoTue, 21 Jul 2009 02:56:00 GMThttp://m.shnenglu.com/guying2008/archive/2009/07/21/90700.html鏈枃涓昏鍖呮嫭浜屼釜閮ㄥ垎錛岀涓閮ㄥ垎閲嶇偣浠嬬粛鍦╒C涓紝鎬庝箞鏍烽噰鐢╯izeof鏉ユ眰緇撴瀯鐨勫ぇ灝忥紝浠ュ強瀹規(guī)槗鍑虹幇鐨勯棶棰橈紝騫剁粰鍑鴻В鍐抽棶棰樼殑鏂規(guī)硶錛岀浜岄儴鍒嗘葷粨鍑篤C涓璼izeof鐨勪富瑕佺敤娉曘?/font>

1銆?sizeof搴旂敤鍦ㄧ粨鏋勪笂鐨勬儏鍐?/font>

璇風湅涓嬮潰鐨勭粨鏋勶細

struct MyStruct

{

double dda1;

char dda;

int type

};

瀵圭粨鏋凪yStruct閲囩敤sizeof浼氬嚭鐜頒粈涔堢粨鏋滃憿錛焥izeof(MyStruct)涓哄灝戝憿錛熶篃璁鎬綘浼氳繖鏍鋒眰錛?/font>

sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

浣嗘槸褰撳湪VC涓祴璇曚笂闈㈢粨鏋勭殑澶у皬鏃訛紝浣犱細鍙戠幇sizeof(MyStruct)涓?6銆備綘鐭ラ亾涓轟粈涔堝湪VC涓細寰楀嚭榪欐牱涓涓粨鏋滃悧錛?/font>

鍏跺疄錛岃繖鏄疺C瀵瑰彉閲忓瓨鍌ㄧ殑涓涓壒孌婂鐞嗐備負浜嗘彁楂楥PU鐨勫瓨鍌ㄩ熷害錛孷C瀵逛竴浜涘彉閲忕殑璧峰鍦板潃鍋氫簡“瀵歸綈”澶勭悊銆傚湪榛樿鎯呭喌涓嬶紝VC瑙勫畾鍚勬垚鍛樺彉閲忓瓨鏀劇殑璧峰鍦板潃鐩稿浜庣粨鏋勭殑璧峰鍦板潃鐨勫亸縐婚噺蹇呴』涓鴻鍙橀噺鐨勭被鍨嬫墍鍗犵敤鐨勫瓧鑺傛暟鐨勫嶆暟銆備笅闈㈠垪鍑哄父鐢ㄧ被鍨嬬殑瀵歸綈鏂瑰紡(vc6.0,32浣嶇郴緇?銆?/font>

綾誨瀷
瀵歸綈鏂瑰紡錛堝彉閲忓瓨鏀劇殑璧峰鍦板潃鐩稿浜庣粨鏋勭殑璧峰鍦板潃鐨勫亸縐婚噺錛?/font>

Char
鍋忕Щ閲忓繀欏諱負sizeof(char)鍗?鐨勫嶆暟

int
鍋忕Щ閲忓繀欏諱負sizeof(int)鍗?鐨勫嶆暟

float
鍋忕Щ閲忓繀欏諱負sizeof(float)鍗?鐨勫嶆暟

double
鍋忕Щ閲忓繀欏諱負sizeof(double)鍗?鐨勫嶆暟

Short
鍋忕Щ閲忓繀欏諱負sizeof(short)鍗?鐨勫嶆暟

 

鍚勬垚鍛樺彉閲忓湪瀛樻斁鐨勬椂鍊欐牴鎹湪緇撴瀯涓嚭鐜扮殑欏哄簭渚濇鐢寵絀洪棿錛屽悓鏃舵寜鐓т笂闈㈢殑瀵歸綈鏂瑰紡璋冩暣浣嶇疆錛岀┖緙虹殑瀛楄妭VC浼氳嚜鍔ㄥ~鍏呫傚悓鏃禫C涓轟簡紜繚緇撴瀯鐨勫ぇ灝忎負緇撴瀯鐨勫瓧鑺傝竟鐣屾暟錛堝嵆璇ョ粨鏋勪腑鍗犵敤鏈澶х┖闂寸殑綾誨瀷鎵鍗犵敤鐨勫瓧鑺傛暟錛夌殑鍊嶆暟錛屾墍浠ュ湪涓烘渶鍚庝竴涓垚鍛樺彉閲忕敵璇風┖闂村悗錛岃繕浼氭牴鎹渶瑕佽嚜鍔ㄥ~鍏呯┖緙虹殑瀛楄妭銆?/font>

涓嬮潰鐢ㄥ墠闈㈢殑渚嬪瓙鏉ヨ鏄嶸C鍒板簳鎬庝箞鏍鋒潵瀛樻斁緇撴瀯鐨勩?/font>

struct MyStruct

{

double dda1;

char dda;

int type

}錛?/font>

涓轟笂闈㈢殑緇撴瀯鍒嗛厤絀洪棿鐨勬椂鍊欙紝VC鏍規(guī)嵁鎴愬憳鍙橀噺鍑虹幇鐨勯『搴忓拰瀵歸綈鏂瑰紡錛屽厛涓虹涓涓垚鍛榙da1鍒嗛厤絀洪棿錛屽叾璧峰鍦板潃璺熺粨鏋勭殑璧峰鍦板潃鐩稿悓錛堝垰濂藉亸縐婚噺0鍒氬ソ涓簊izeof(double)鐨勫嶆暟錛夛紝璇ユ垚鍛樺彉閲忓崰鐢╯izeof(double)=8涓瓧鑺傦紱鎺ヤ笅鏉ヤ負絎簩涓垚鍛榙da鍒嗛厤絀洪棿錛岃繖鏃朵笅涓涓彲浠ュ垎閰嶇殑鍦板潃瀵逛簬緇撴瀯鐨勮搗濮嬪湴鍧鐨勫亸縐婚噺涓?錛屾槸sizeof(char)鐨勫嶆暟錛屾墍浠ユ妸dda瀛樻斁鍦ㄥ亸縐婚噺涓?鐨勫湴鏂規(guī)弧瓚沖榻愭柟寮忥紝璇ユ垚鍛樺彉閲忓崰鐢╯izeof(char)=1涓瓧鑺傦紱鎺ヤ笅鏉ヤ負絎笁涓垚鍛榯ype鍒嗛厤絀洪棿錛岃繖鏃朵笅涓涓彲浠ュ垎閰嶇殑鍦板潃瀵逛簬緇撴瀯鐨勮搗濮嬪湴鍧鐨勫亸縐婚噺涓?錛屼笉鏄痵izeof(int)=4鐨勫嶆暟錛屼負浜嗘弧瓚沖榻愭柟寮忓鍋忕Щ閲忕殑綰︽潫闂錛孷C鑷姩濉厖3涓瓧鑺傦紙榪欎笁涓瓧鑺傛病鏈夋斁浠涔堜笢瑗匡級錛岃繖鏃朵笅涓涓彲浠ュ垎閰嶇殑鍦板潃瀵逛簬緇撴瀯鐨勮搗濮嬪湴鍧鐨勫亸縐婚噺涓?2錛屽垰濂芥槸sizeof(int)=4鐨勫嶆暟錛屾墍浠ユ妸type瀛樻斁鍦ㄥ亸縐婚噺涓?2鐨勫湴鏂癸紝璇ユ垚鍛樺彉閲忓崰鐢╯izeof(int)=4涓瓧鑺傦紱榪欐椂鏁翠釜緇撴瀯鐨勬垚鍛樺彉閲忓凡緇忛兘鍒嗛厤浜嗙┖闂達紝鎬葷殑鍗犵敤鐨勭┖闂村ぇ灝忎負錛?+1+3+4=16錛屽垰濂戒負緇撴瀯鐨勫瓧鑺傝竟鐣屾暟錛堝嵆緇撴瀯涓崰鐢ㄦ渶澶х┖闂寸殑綾誨瀷鎵鍗犵敤鐨勫瓧鑺傛暟sizeof(double)=8錛夌殑鍊嶆暟錛屾墍浠ユ病鏈夌┖緙虹殑瀛楄妭闇瑕佸~鍏呫傛墍浠ユ暣涓粨鏋勭殑澶у皬涓猴細sizeof(MyStruct)=8+1+3+4=16錛屽叾涓湁3涓瓧鑺傛槸VC鑷姩濉厖鐨勶紝娌℃湁鏀句換浣曟湁鎰忎箟鐨勪笢瑗褲?/font>

涓嬮潰鍐嶄婦涓緥瀛愶紝浜ゆ崲涓涓嬩笂闈㈢殑MyStruct鐨勬垚鍛樺彉閲忕殑浣嶇疆錛屼嬌瀹冨彉鎴愪笅闈㈢殑鎯呭喌錛?/font>

struct MyStruct

{

char dda;

double dda1;

int type

}錛?/font>

榪欎釜緇撴瀯鍗犵敤鐨勭┖闂翠負澶氬ぇ鍛紵鍦╒C6.0鐜涓嬶紝鍙互寰楀埌sizeof(MyStruc)涓?4銆傜粨鍚堜笂闈㈡彁鍒扮殑鍒嗛厤絀洪棿鐨勪竴浜涘師鍒欙紝鍒嗘瀽涓媀C鎬庝箞鏍蜂負涓婇潰鐨勭粨鏋勫垎閰嶇┖闂寸殑銆傦紙綆鍗曡鏄庯級

struct MyStruct

{

char dda;//鍋忕Щ閲忎負0錛屾弧瓚沖榻愭柟寮忥紝dda鍗犵敤1涓瓧鑺傦紱

double dda1;//涓嬩竴涓彲鐢ㄧ殑鍦板潃鐨勫亸縐婚噺涓?錛屼笉鏄痵izeof(double)=8

//鐨勫嶆暟錛岄渶瑕佽ˉ瓚?涓瓧鑺傛墠鑳戒嬌鍋忕Щ閲忓彉涓?錛堟弧瓚沖榻?/font>

//鏂瑰紡錛夛紝鍥犳VC鑷姩濉厖7涓瓧鑺傦紝dda1瀛樻斁鍦ㄥ亸縐婚噺涓?

//鐨勫湴鍧涓婏紝瀹冨崰鐢?涓瓧鑺傘?/font>

int type錛?/涓嬩竴涓彲鐢ㄧ殑鍦板潃鐨勫亸縐婚噺涓?6錛屾槸sizeof(int)=4鐨勫?/font>

//鏁幫紝婊¤凍int鐨勫榻愭柟寮忥紝鎵浠ヤ笉闇瑕乂C鑷姩濉厖錛宼ype瀛?/font>

//鏀懼湪鍋忕Щ閲忎負16鐨勫湴鍧涓婏紝瀹冨崰鐢?涓瓧鑺傘?/font>

}錛?/鎵鏈夋垚鍛樺彉閲忛兘鍒嗛厤浜嗙┖闂達紝絀洪棿鎬葷殑澶у皬涓?+7+8+4=20錛屼笉鏄粨鏋?/font>

//鐨勮妭杈圭晫鏁幫紙鍗崇粨鏋勪腑鍗犵敤鏈澶х┖闂寸殑綾誨瀷鎵鍗犵敤鐨勫瓧鑺傛暟sizeof

//(double)=8錛夌殑鍊嶆暟錛屾墍浠ラ渶瑕佸~鍏?涓瓧鑺傦紝浠ユ弧瓚崇粨鏋勭殑澶у皬涓?/font>

//sizeof(double)=8鐨勫嶆暟銆?/font>

 

鎵浠ヨ緇撴瀯鎬葷殑澶у皬涓猴細sizeof(MyStruc)涓?+7+8+4+4=24銆傚叾涓葷殑鏈?+4=11涓瓧鑺傛槸VC鑷姩濉厖鐨勶紝娌℃湁鏀句換浣曟湁鎰忎箟鐨勪笢瑗褲?/font>

 

VC瀵圭粨鏋勭殑瀛樺偍鐨勭壒孌婂鐞嗙‘瀹炴彁楂楥PU瀛樺偍鍙橀噺鐨勯熷害錛屼絾鏄湁鏃跺欎篃甯︽潵浜嗕竴浜涢夯鐑︼紝鎴戜滑涔熷睆钄芥帀鍙橀噺榛樿鐨勫榻愭柟寮忥紝鑷繁鍙互璁懼畾鍙橀噺鐨勫榻愭柟寮忋?/font>

VC涓彁渚涗簡#pragma pack(n)鏉ヨ瀹氬彉閲忎互n瀛楄妭瀵歸綈鏂瑰紡銆俷瀛楄妭瀵歸綈灝辨槸璇村彉閲忓瓨鏀劇殑璧峰鍦板潃鐨勫亸縐婚噺鏈変袱縐嶆儏鍐碉細絎竴銆佸鏋渘澶т簬絳変簬璇ュ彉閲忔墍鍗犵敤鐨勫瓧鑺傛暟錛岄偅涔堝亸縐婚噺蹇呴』婊¤凍榛樿鐨勫榻愭柟寮忥紝絎簩銆佸鏋渘灝忎簬璇ュ彉閲忕殑綾誨瀷鎵鍗犵敤鐨勫瓧鑺傛暟錛岄偅涔堝亸縐婚噺涓簄鐨勫嶆暟錛屼笉鐢ㄦ弧瓚抽粯璁ょ殑瀵歸綈鏂瑰紡銆傜粨鏋勭殑鎬誨ぇ灝忎篃鏈変釜綰︽潫鏉′歡錛屽垎涓嬮潰涓ょ鎯呭喌錛氬鏋渘澶т簬鎵鏈夋垚鍛樺彉閲忕被鍨嬫墍鍗犵敤鐨勫瓧鑺傛暟錛岄偅涔堢粨鏋勭殑鎬誨ぇ灝忓繀欏諱負鍗犵敤絀洪棿鏈澶х殑鍙橀噺鍗犵敤鐨勭┖闂存暟鐨勫嶆暟錛?/font>

鍚﹀垯蹇呴』涓簄鐨勫嶆暟銆備笅闈婦渚嬭鏄庡叾鐢ㄦ硶銆?/font>

#pragma pack(push) //淇濆瓨瀵歸綈鐘舵?/font>

#pragma pack(4)//璁懼畾涓?瀛楄妭瀵歸綈

struct test

{

char m1;

double m4;

int m3;

};

#pragma pack(pop)//鎭㈠瀵歸綈鐘舵?/font>

浠ヤ笂緇撴瀯鐨勫ぇ灝忎負16錛屼笅闈㈠垎鏋愬叾瀛樺偍鎯呭喌錛岄鍏堜負m1鍒嗛厤絀洪棿錛屽叾鍋忕Щ閲忎負0錛屾弧瓚蟲垜浠嚜宸辮瀹氱殑瀵歸綈鏂瑰紡錛?瀛楄妭瀵歸綈錛夛紝m1鍗犵敤1涓瓧鑺傘傛帴鐫寮濮嬩負m4鍒嗛厤絀洪棿錛岃繖鏃跺叾鍋忕Щ閲忎負1錛岄渶瑕佽ˉ瓚?涓瓧鑺傦紝榪欐牱浣垮亸縐婚噺婊¤凍涓簄=4鐨勫嶆暟錛堝洜涓簊izeof(double)澶т簬n錛?m4鍗犵敤8涓瓧鑺傘傛帴鐫涓簃3鍒嗛厤絀洪棿錛岃繖鏃跺叾鍋忕Щ閲忎負12錛屾弧瓚充負4鐨勫嶆暟錛宮3鍗犵敤4涓瓧鑺傘傝繖鏃跺凡緇忎負鎵鏈夋垚鍛樺彉閲忓垎閰嶄簡絀洪棿錛屽叡鍒嗛厤浜?6涓瓧鑺傦紝婊¤凍涓簄鐨勫嶆暟銆傚鏋滄妸涓婇潰鐨?pragma pack(4)鏀逛負#pragma pack(16)錛岄偅涔堟垜浠彲浠ュ緱鍒扮粨鏋勭殑澶у皬涓?4銆傦紙璇瘋鑰呰嚜宸卞垎鏋愶級

2銆?sizeof鐢ㄦ硶鎬葷粨

鍦╒C涓紝sizeof鏈夌潃璁稿鐨勭敤娉曪紝鑰屼笖寰堝鏄撳紩璧蜂竴浜涢敊璇備笅闈㈡牴鎹畇izeof鍚庨潰鐨勫弬鏁板sizeof鐨勭敤娉曞仛涓葷粨銆?/font>

A錛?鍙傛暟涓烘暟鎹被鍨嬫垨鑰呬負涓鑸彉閲忋備緥濡俿izeof(int),sizeof(long)絳夌瓑銆傝繖縐嶆儏鍐佃娉ㄦ剰鐨勬槸涓嶅悓緋葷粺緋葷粺鎴栬呬笉鍚岀紪璇戝櫒寰楀埌鐨勭粨鏋滃彲鑳芥槸涓嶅悓鐨勩備緥濡俰nt綾誨瀷鍦?6浣嶇郴緇熶腑鍗?涓瓧鑺傦紝鍦?2浣嶇郴緇熶腑鍗?涓瓧鑺傘?/font>

B錛?鍙傛暟涓烘暟緇勬垨鎸囬拡銆備笅闈婦渚嬭鏄?

int a[50]; //sizeof(a)=4*50=200; 姹傛暟緇勬墍鍗犵殑絀洪棿澶у皬

int *a=new int[50];// sizeof(a)=4; a涓轟竴涓寚閽堬紝sizeof(a)鏄眰鎸囬拡

//鐨勫ぇ灝?鍦?2浣嶇郴緇熶腑錛屽綋鐒舵槸鍗?涓瓧鑺傘?/font>

C錛?鍙傛暟涓虹粨鏋勬垨綾匯係izeof搴旂敤鍦ㄧ被鍜岀粨鏋勭殑澶勭悊鎯呭喌鏄浉鍚岀殑銆備絾鏈変袱鐐歸渶瑕佹敞鎰忥紝絎竴銆佺粨鏋勬垨鑰呯被涓殑闈欐佹垚鍛樹笉瀵圭粨鏋勬垨鑰呯被鐨勫ぇ灝忎駭鐢熷獎鍝嶏紝鍥犱負闈欐佸彉閲忕殑瀛樺偍浣嶇疆涓庣粨鏋勬垨鑰呯被鐨勫疄渚嬪湴鍧鏃犲叧銆?/font>

絎簩銆佹病鏈夋垚鍛樺彉閲忕殑緇撴瀯鎴栫被鐨勫ぇ灝忎負1錛屽洜涓哄繀欏諱繚璇佺粨鏋勬垨綾葷殑姣忎竴

涓疄渚嬪湪鍐呭瓨涓兘鏈夊敮涓鐨勫湴鍧銆?/font>

涓嬮潰涓句緥璇存槑錛?/font>

Class Test{int a;static double c};//sizeof(Test)=4.

Test *s;//sizeof(s)=4,s涓轟竴涓寚閽堛?/font>

Class test1{ };//sizeof(test1)=1;

D錛?鍙傛暟涓哄叾浠栥備笅闈婦渚嬭鏄庛?/font>

int func(char s[5]);

{

cout<< sizeof(s) << endl;
//鏁扮粍鍙傛暟鍦ㄤ紶閫掔殑鏃跺欑郴緇熷鐞嗕負涓涓寚閽堬紝鎵

//浠izeof(s)瀹為檯涓婁負姹傛寚閽堢殑澶у皬銆?/font>

return 1;

}

sizeof(func(“1234”))=4//鍥犱負func鐨勮繑鍥炵被鍨嬩負int錛屾墍浠ョ浉褰撲簬

姹俿izeof(int).

 

浠ヤ笂涓簊izeof鐨勫熀鏈敤娉曪紝鍦ㄥ疄闄呯殑浣跨敤涓娉ㄦ剰鍒嗘瀽VC鐨勫垎閰嶅彉閲忕殑鍒嗛厤絳栫暐錛岃繖鏍風殑璇濆彲浠ラ伩鍏嶄竴浜涢敊璇?/font>



]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲日本欧美| 国产精品美女午夜av| 91久久精品一区| 免费不卡欧美自拍视频| 久久免费高清| 久久狠狠久久综合桃花| 亚洲韩国日本中文字幕| 国产亚洲精品福利| 国内揄拍国内精品少妇国语| 国产精品视频xxxx| 欧美日韩一区免费| 蜜臀av一级做a爰片久久| 在线观看国产一区二区| 欧美精品麻豆| 久久狠狠久久综合桃花| 亚洲全黄一级网站| 久久亚洲精品一区二区| 久久久精品国产一区二区三区| 亚洲欧洲精品成人久久奇米网 | 久久尤物视频| 久久精彩免费视频| 亚洲二区免费| 久久精品在这里| 尤物九九久久国产精品的特点| 亚洲欧美经典视频| 在线不卡a资源高清| 亚洲成人在线网| 一区二区三区在线免费视频| 国产亚洲观看| 一区国产精品| 亚洲国产日本| 亚洲一区二区三区777| 艳妇臀荡乳欲伦亚洲一区| 亚洲成色精品| 99国产精品99久久久久久粉嫩| 亚洲精品中文在线| 一区二区免费在线视频| 亚洲三级观看| 在线 亚洲欧美在线综合一区| 日韩一区二区久久| 亚洲欧美日韩国产中文 | 在线日本高清免费不卡| 亚洲视频播放| 久久久久成人精品| 久久永久免费| 国产亚洲精品久久久久久| 亚洲国产你懂的| 日韩香蕉视频| 久久成人18免费观看| 久久人91精品久久久久久不卡| 欧美成人午夜免费视在线看片| 亚洲高清一区二| 欧美一级二区| 国产精品久久久久永久免费观看 | 久久久亚洲国产天美传媒修理工| 亚洲国产精品一区| 亚洲男人的天堂在线aⅴ视频| 欧美视频一区二区在线观看| 亚洲国产欧美一区二区三区久久| 亚洲一区在线播放| 91久久久一线二线三线品牌| 亚洲成人在线免费| 欧美mv日韩mv亚洲| 亚洲精品久久久久中文字幕欢迎你 | 在线看视频不卡| 欧美一区二区三区久久精品 | 99视频有精品| 国产欧美一区二区三区久久| 亚洲福利小视频| 亚洲私人影院| 亚洲人成网在线播放| 久久久无码精品亚洲日韩按摩| 国产日韩欧美黄色| 久久久精品动漫| 亚洲欧美中文字幕| 国产欧美日韩精品一区| 免费一级欧美在线大片| 狠狠网亚洲精品| 一区二区激情| 国产精品美女xx| 欧美国产激情| 国产精品国产三级国产专区53 | 亚洲曰本av电影| 亚洲伦理在线| 亚洲综合久久久久| 欧美视频免费在线观看| 久久三级福利| 欧美日韩一二三区| 最新国产成人av网站网址麻豆| 国产精品v欧美精品v日韩精品| 蜜臀久久99精品久久久久久9| 欧美日韩在线影院| 亚洲国产成人tv| 亚洲精品在线观看免费| 亚洲综合视频1区| 欧美**人妖| 91久久精品国产91久久性色tv | 欧美日韩精品免费看| 久久嫩草精品久久久精品| 欧美激情偷拍| 精品69视频一区二区三区| 欧美一区二区福利在线| 一区二区三区日韩精品视频| 国产精品永久免费在线| 午夜在线视频观看日韩17c| 在线观看视频一区二区欧美日韩| 亚洲美女中文字幕| 香蕉久久精品日日躁夜夜躁| 午夜亚洲影视| 玖玖综合伊人| 久久精品国产99国产精品| 亚洲网友自拍| 一区二区三区欧美视频| 亚洲综合999| 久久婷婷丁香| 久久久久久久久久久久久久一区 | 免费观看30秒视频久久| 欧美黄色一区| 日韩视频一区| 国产欧美日韩另类一区| 裸体歌舞表演一区二区| 亚洲一区二区三区涩| 亚洲精品中文字幕有码专区| 最新亚洲电影| 久久国产精品第一页| 亚洲精品一区在线| 国产精品有限公司| 亚洲在线观看视频网站| 夜夜狂射影院欧美极品| 亚洲久久一区二区| 黄色日韩在线| 国产精品女主播在线观看| 国产精品国产三级国产专播品爱网 | 亚洲大胆美女视频| 欧美在线视频免费播放| 夜夜嗨av一区二区三区网页| 日韩午夜精品视频| 亚洲在线观看免费视频| 亚洲第一在线综合网站| 欧美四级在线| 国产精品国产三级国产aⅴ入口 | 国内视频精品| 欧美日韩国产综合视频在线观看 | 一区二区三区免费看| 免费观看一级特黄欧美大片| 久久久久综合网| 欧美伊人影院| 久久中文久久字幕| 欧美黄色一区二区| 一区二区三区蜜桃网| 欧美精品三级在线观看| 男人的天堂成人在线| 欧美不卡福利| 国产亚洲二区| 国产一区二区毛片| 亚洲欧美在线免费| 美女91精品| 国产精品中文在线| 亚洲激情成人网| 亚洲破处大片| 欧美性做爰毛片| 在线观看亚洲视频| 中国亚洲黄色| 日韩写真视频在线观看| 欧美精品一级| 亚洲视频一二区| 久久婷婷国产综合尤物精品 | 久热精品视频| 国产精品高潮视频| 欧美69wwwcom| 久久一本综合频道| 羞羞答答国产精品www一本| 欧美激情在线有限公司| 亚洲欧美日韩第一区| 国产欧美丝祙| 99国产精品| 亚洲精品久久久久久下一站| 久久人人超碰| 母乳一区在线观看| 久久久久国内| 黄网站色欧美视频| 欧美一区久久| 久久精品亚洲乱码伦伦中文 | 你懂的视频欧美| 欧美精品v日韩精品v韩国精品v | 亚洲人在线视频| 国产欧美视频一区二区| 亚洲欧洲视频| 欧美电影资源| 欧美一区二区三区在线看| 久久综合狠狠综合久久激情| 久久精品在线| 精品999久久久| 亚洲伊人伊色伊影伊综合网| 久久亚洲私人国产精品va| 久久国产手机看片| 国产视频久久久久久久| 亚洲国产高潮在线观看| 国产欧美一区二区精品忘忧草 | 日韩一二三区视频|