锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
[鐗堟潈澹版槑]錛氭鏂囨。閬靛驚GNU鑷敱鏂囨。璁稿彲璇?GNU Free Documentation License).浠諱綍浜哄彲浠ヨ嚜鐢卞鍒?鍒嗗彂,淇敼,涓嶈繃濡傛灉鏂逛究,璇鋒敞鏄庡嚭澶勫拰浣滆?)
(1)瀵艱█錛?/font>
棣栧厛錛屾垜寮虹儓寤鴻澶у闃呰Richard Stevens钁椾綔銆奣CP/IP Illustracted Volume 1,2,3銆嬪拰銆奤NIX Network Programming Volume 1,2銆嬨傝櫧鐒朵粬紱誨紑鎴戜滑澶у宸茬粡5騫村浜嗭紝浣嗘槸浠栫殑涔︿緷鐒舵槸榪涘叆緗戠粶緙栫▼鐨勬渶鐩存帴鐨勯亾璺傚叾涓殑3鍗風殑銆奣CP/IP Illustracted銆嬪嵎1鏄繀璇伙紞濡傛灉浣犱笉浜嗚Вtcp鍗忚鍚勪釜閫夐」鐨勮緇嗗畾涔夛紝浣犲氨澶卞幓浜嗕紭鍖栫▼搴忛噸瑕佺殑涓涓墜孌點傚嵎2,3鍙互閫夎涓涓嬨傛瘮濡傚嵎2璁茶В鐨勬槸4.4BSD鍐呮牳TCP/IP鍗忚鏍堝疄鐜?---榪欎釜鐗堟湰鐨勫崗璁爤鍑犱箮褰卞搷浜嗙幇鍦ㄦ墍鏈夌殑涓繪祦os錛屼絾鏄洜涓哄勾浠d箙榪滐紝鍐呭涓嶄竴瀹氶偅涔坴ogue.鍦ㄨ繖閲屾垜澶氭帹鑽愪竴鏈奣he Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel銆嬶紝浠?.4鍐呮牳璁茶ВLinux TCP/IP瀹炵幇錛岀浉褰撲笉閿?浣滀負涓涓幇瀹炰笘鐣屼腑鐨勫疄鐜幫紝寰堝鏃跺欎綘蹇呴』浣滃緢澶氭潈琛★紝榪欐椂鍊欏弬鑰冧竴涓箙緇忚冮獙鐨勭郴緇熸洿鏈夊疄闄呮剰涔夈備婦涓緥瀛?linux鍐呮牳涓璼k_buff緇撴瀯涓轟簡榪芥眰閫熷害鍜屽畨鍏紝鐗虹壊浜嗛儴鍒嗗唴瀛橈紝鎵浠ュ湪鍙戦乀CP鍖呯殑鏃跺欙紝鏃犺搴旂敤灞傛暟鎹澶?sk_buff鏈灝忎篃鏈?72鐨勫瓧鑺?
鍏跺疄瀵逛簬socket搴旂敤灞傜▼搴忔潵璇達紝銆奤NIX Network Programming Volume 1銆嬫剰涔夋洿澶т竴鐐?2003騫寸殑鏃跺欙紝榪欐湰涔﹀嚭浜嗘渶鏂扮殑絎?鐗堟湰錛屼笉榪囦富瑕佽繕鏄慨璁㈢2鐗堟湰銆傚叾涓6绔犮奍/O Multiplexing銆嬫槸鏈閲嶈鐨勩係tevens緇欏嚭浜嗙綉緇淚O鐨勫熀鏈ā鍨嬨傚湪榪欓噷鏈閲嶈鐨勮帿榪囦簬select妯″瀷鍜孉synchronous I/O妯″瀷.浠庣悊璁轟笂璇達紝AIO浼間箮鏄渶楂樻晥鐨勶紝浣犵殑IO鎿嶄綔鍙互绔嬪嵆榪斿洖錛岀劧鍚庣瓑寰卭s鍛婅瘔浣營O鎿嶄綔瀹屾垚銆備絾鏄竴鐩翠互鏉ワ紝濡備綍瀹炵幇灝辨病鏈変竴涓畬緹庣殑鏂規銆傛渶钁楀悕鐨剋indows瀹屾垚绔彛瀹炵幇鐨凙IO,瀹為檯涓婁篃鏄唴閮ㄧ敤綰跨▼姹犲疄鐜扮殑緗簡錛屾渶鍚庣殑緇撴灉鏄疘O鏈変釜綰跨▼姹狅紝浣犲簲鐢ㄤ篃闇瑕佷竴涓嚎紼嬫睜......寰堝鏂囨。鍏跺疄宸茬粡鎸囧嚭浜嗚繖甯︽潵鐨勭嚎紼媍ontext-switch甯︽潵鐨勪唬浠楓?/font>
鍦╨inux騫沖彴涓婏紝鍏充簬緗戠粶AIO涓鐩存槸鏀瑰姩鏈澶氱殑鍦版柟錛?.4鐨勫勾浠e氨鏈夊緢澶欰IO鍐呮牳patch,鏈钁楀悕鐨勫簲璇ョ畻鏄疭GI閭d釜銆備絾鏄竴鐩村埌2.6鍐呮牳鍙戝竷錛岀綉緇滄ā鍧楃殑AIO涓鐩存病鏈夎繘鍏ョǔ瀹氬唴鏍哥増鏈?澶ч儴鍒嗛兘鏄嬌鐢ㄧ敤鎴風嚎紼嬫ā鎷熸柟娉曪紝鍦ㄤ嬌鐢ㄤ簡NPTL鐨刲inux涓婇潰鍏跺疄鍜寃indows鐨勫畬鎴愮鍙e熀鏈笂宸笉澶氫簡)銆?.6鍐呮牳鎵鏀寔鐨凙IO鐗規寚紓佺洏鐨凙IO---鏀寔io_submit(),io_getevents()浠ュ強瀵笵irect IO鐨勬敮鎸?灝辨槸緇曡繃VFS緋葷粺buffer鐩存帴鍐欑‖鐩橈紝瀵逛簬嫻佹湇鍔″櫒鍦ㄥ唴瀛樺鉤紼蟲т笂鏈夌浉褰撳府鍔?銆?/font>
鎵浠ワ紝鍓╀笅鐨剆elect妯″瀷鍩烘湰涓婂氨鏄垜浠湪linux涓婇潰鐨勫敮涓閫夋嫨錛屽叾瀹烇紝濡傛灉鍔犱笂no-block socket鐨勯厤緗紝鍙互瀹屾垚涓涓?浼?AIO鐨勫疄鐜幫紝鍙笉榪囨帹鍔ㄥ姏鍦ㄤ簬浣犺屼笉鏄痮s鑰屽凡銆備笉榪囦紶緇熺殑select/poll鍑芥暟鏈夌潃涓浜涙棤娉曞繊鍙楃殑緙虹偣錛屾墍浠ユ敼榪涗竴鐩存槸2.4-2.5寮鍙戠増鏈唴鏍哥殑浠誨姟錛屽寘鎷?dev/poll錛宺ealtime signal絳夌瓑銆傛渶緇堬紝Davide Libenzi寮鍙戠殑epoll榪涘叆2.6鍐呮牳鎴愪負姝e紡鐨勮В鍐蟲柟妗?/font>
(2)epoll鐨勪紭鐐?/font>
<1>鏀寔涓涓繘紼嬫墦寮澶ф暟鐩殑socket鎻忚堪絎?FD)
select鏈涓嶈兘蹇嶅彈鐨勬槸涓涓繘紼嬫墍鎵撳紑鐨凢D鏄湁涓瀹氶檺鍒剁殑錛岀敱FD_SETSIZE璁劇疆錛岄粯璁ゅ兼槸2048銆傚浜庨偅浜涢渶瑕佹敮鎸佺殑涓婁竾榪炴帴鏁扮洰鐨処M鏈嶅姟鍣ㄦ潵璇存樉鐒跺お灝戜簡 銆傝繖鏃跺欎綘涓鏄彲浠ラ夋嫨淇敼榪欎釜瀹忕劧鍚庨噸鏂扮紪璇戝唴鏍革紝涓嶈繃璧勬枡涔熷悓鏃舵寚鍑鴻繖鏍蜂細甯︽潵緗戠粶鏁堢巼鐨勪笅闄嶏紝浜屾槸鍙互閫夋嫨澶氳繘紼嬬殑瑙e喅鏂規(浼犵粺鐨凙pache鏂規)錛屼笉榪囪櫧鐒秎inux涓婇潰鍒涘緩榪涚▼鐨勪唬浠鋒瘮杈冨皬錛屼絾浠嶆棫鏄笉鍙拷瑙嗙殑錛屽姞涓婅繘紼嬮棿鏁版嵁鍚屾榪滄瘮涓嶄笂綰跨▼闂村悓姝ョ殑楂樻晥錛屾墍浠ヤ篃涓嶆槸涓縐嶅畬緹庣殑鏂規銆備笉榪噀poll鍒欐病鏈夎繖涓檺鍒訛紝瀹冩墍鏀寔鐨凢D涓婇檺鏄渶澶у彲浠ユ墦寮鏂囦歡鐨勬暟鐩紝榪欎釜鏁板瓧涓鑸繙澶т簬2048,涓句釜渚嬪瓙,鍦?GB鍐呭瓨鐨勬満鍣ㄤ笂澶х害鏄?0涓囧乏鍙籌紝鍏蜂綋鏁扮洰鍙互cat /proc/sys/fs/file-max瀵熺湅,涓鑸潵璇磋繖涓暟鐩拰緋葷粺鍐呭瓨鍏崇郴寰堝ぇ銆?/font>
<2>IO鏁堢巼涓嶉殢FD鏁扮洰澧炲姞鑰岀嚎鎬т笅闄?/font>
浼犵粺鐨剆elect/poll鍙︿竴涓嚧鍛藉急鐐瑰氨鏄綋浣犳嫢鏈変竴涓緢澶х殑socket闆嗗悎錛屼笉榪囩敱浜庣綉緇滃歡鏃訛紝浠諱竴鏃墮棿鍙湁閮ㄥ垎鐨剆ocket鏄?媧昏穬"鐨勶紝浣嗘槸select/poll姣忔璋冪敤閮戒細綰挎ф壂鎻忓叏閮ㄧ殑闆嗗悎錛屽鑷存晥鐜囧憟鐜扮嚎鎬т笅闄嶃備絾鏄痚poll涓嶅瓨鍦ㄨ繖涓棶棰橈紝瀹冨彧浼氬"媧昏穬"鐨剆ocket榪涜鎿嶄綔---榪欐槸鍥犱負鍦ㄥ唴鏍稿疄鐜頒腑epoll鏄牴鎹瘡涓猣d涓婇潰鐨刢allback鍑芥暟瀹炵幇鐨勩傞偅涔堬紝鍙湁"媧昏穬"鐨剆ocket鎵嶄細涓誨姩鐨勫幓璋冪敤callback鍑芥暟錛屽叾浠杋dle鐘舵乻ocket鍒欎笉浼氾紝鍦ㄨ繖鐐逛笂錛宔poll瀹炵幇浜嗕竴涓?浼?AIO錛屽洜涓鴻繖鏃跺欐帹鍔ㄥ姏鍦╫s鍐呮牳銆傚湪涓浜沚enchmark涓紝濡傛灉鎵鏈夌殑socket鍩烘湰涓婇兘鏄椿璺冪殑---姣斿涓涓珮閫烲AN鐜錛宔poll騫朵笉姣攕elect/poll鏈変粈涔堟晥鐜囷紝鐩稿弽錛屽鏋滆繃澶氫嬌鐢╡poll_ctl,鏁堢巼鐩告瘮榪樻湁紼嶅井鐨勪笅闄嶃備絾鏄竴鏃︿嬌鐢╥dle connections妯℃嫙WAN鐜,epoll鐨勬晥鐜囧氨榪滃湪select/poll涔嬩笂浜嗐?/font>
<3>浣跨敤mmap鍔犻熷唴鏍鎬笌鐢ㄦ埛絀洪棿鐨勬秷鎭紶閫掋?/font>
榪欑偣瀹為檯涓婃秹鍙婂埌epoll鐨勫叿浣撳疄鐜頒簡銆傛棤璁烘槸select,poll榪樻槸epoll閮介渶瑕佸唴鏍告妸FD娑堟伅閫氱煡緇欑敤鎴風┖闂達紝濡備綍閬垮厤涓嶅繀瑕佺殑鍐呭瓨鎷瘋礉灝卞緢閲嶈錛屽湪榪欑偣涓婏紝epoll鏄氳繃鍐呮牳浜庣敤鎴風┖闂磎map鍚屼竴鍧楀唴瀛樺疄鐜扮殑銆傝屽鏋滀綘鎯蟲垜涓鏍蜂粠2.5鍐呮牳灝卞叧娉╡poll鐨勮瘽錛屼竴瀹氫笉浼氬繕璁版墜宸map榪欎竴姝ョ殑銆?/font>
<4>鍐呮牳寰皟
榪欎竴鐐瑰叾瀹炰笉綆梕poll鐨勪紭鐐逛簡錛岃屾槸鏁翠釜linux騫沖彴鐨勪紭鐐廣備篃璁鎬綘鍙互鎬鐤憀inux騫沖彴錛屼絾鏄綘鏃犳硶鍥為伩linux騫沖彴璧嬩簣浣犲井璋冨唴鏍哥殑鑳藉姏銆傛瘮濡傦紝鍐呮牳TCP/IP鍗忚鏍堜嬌鐢ㄥ唴瀛樻睜綆$悊sk_buff緇撴瀯錛岄偅涔堝彲浠ュ湪榪愯鏃舵湡鍔ㄦ佽皟鏁磋繖涓唴瀛榩ool(skb_head_pool)鐨勫ぇ灝?--閫氳繃echo XXXX>/proc/sys/net/core/hot_list_length瀹屾垚銆傚啀姣斿listen鍑芥暟鐨勭2涓弬鏁?TCP瀹屾垚3嬈℃彙鎵嬬殑鏁版嵁鍖呴槦鍒楅暱搴?錛屼篃鍙互鏍規嵁浣犲鉤鍙板唴瀛樺ぇ灝忓姩鎬佽皟鏁淬傛洿鐢氳嚦鍦ㄤ竴涓?/font>鏁版嵁鍖?/font>闈㈡暟鐩法澶т絾鍚屾椂姣忎釜鏁版嵁鍖呮湰韜ぇ灝忓嵈寰堝皬鐨勭壒孌婄郴緇熶笂灝濊瘯鏈鏂扮殑NAPI緗戝崱椹卞姩鏋舵瀯銆?/font>
(3)epoll鐨勪嬌鐢?/font>
浠や漢楂樺叴鐨勬槸錛?.6鍐呮牳鐨別poll姣斿叾2.5寮鍙戠増鏈殑/dev/epoll綆媧佷簡璁稿錛屾墍浠ワ紝澶ч儴鍒嗘儏鍐典笅錛屽己澶х殑涓滆タ寰寰鏄畝鍗曠殑銆傚敮涓鏈夌偣楹葷儲鏄痚poll鏈?縐嶅伐浣滄柟寮?LT鍜孍T銆?/font>
LT(level triggered)鏄己鐪佺殑宸ヤ綔鏂瑰紡錛屽茍涓斿悓鏃舵敮鎸乥lock鍜宯o-block socket.鍦ㄨ繖縐嶅仛娉曚腑錛屽唴鏍稿憡璇変綘涓涓枃浠舵弿榪扮鏄惁灝辯華浜嗭紝鐒跺悗浣犲彲浠ュ榪欎釜灝辯華鐨刦d榪涜IO鎿嶄綔銆傚鏋滀綘涓嶄綔浠諱綍鎿嶄綔錛屽唴鏍歌繕鏄細緇х畫閫氱煡浣犵殑錛屾墍浠ワ紝榪欑妯″紡緙栫▼鍑洪敊璇彲鑳芥ц灝忎竴鐐廣備紶緇熺殑select/poll閮芥槸榪欑妯″瀷鐨勪唬琛紟
ET(edge-triggered)鏄珮閫熷伐浣滄柟寮忥紝鍙敮鎸乶o-block socket銆傚湪榪欑妯″紡涓嬶紝褰撴弿榪扮浠庢湭灝辯華鍙樹負灝辯華鏃訛紝鍐呮牳閫氳繃epoll鍛婅瘔浣犮傜劧鍚庡畠浼氬亣璁句綘鐭ラ亾鏂囦歡鎻忚堪絎﹀凡緇忓氨緇紝騫朵笖涓嶄細鍐嶄負閭d釜鏂囦歡鎻忚堪絎﹀彂閫佹洿澶氱殑灝辯華閫氱煡錛岀洿鍒頒綘鍋氫簡鏌愪簺鎿嶄綔瀵艱嚧閭d釜鏂囦歡鎻忚堪絎︿笉鍐嶄負灝辯華鐘舵佷簡(姣斿錛屼綘鍦ㄥ彂閫侊紝鎺ユ敹鎴栬呮帴鏀惰姹傦紝鎴栬呭彂閫佹帴鏀剁殑鏁版嵁灝戜簬涓瀹氶噺鏃跺鑷翠簡涓涓狤WOULDBLOCK 閿欒錛夈備絾鏄娉ㄦ剰錛屽鏋滀竴鐩翠笉瀵硅繖涓猣d浣淚O鎿嶄綔(浠庤屽鑷村畠鍐嶆鍙樻垚鏈氨緇?錛屽唴鏍鎬笉浼氬彂閫佹洿澶氱殑閫氱煡(only once),涓嶈繃鍦═CP鍗忚涓紝ET妯″紡鐨勫姞閫熸晥鐢ㄤ粛闇瑕佹洿澶氱殑benchmark紜銆?/font>
epoll鍙湁epoll_create,epoll_ctl,epoll_wait 3涓郴緇熻皟鐢紝鍏蜂綋鐢ㄦ硶璇峰弬鑰僪ttp://www.xmailserver.org/linux-patches/nio-improve.html 錛?br>鍦╤ttp://www.kegel.com/rn/涔熸湁涓涓畬鏁寸殑渚嬪瓙錛屽ぇ瀹朵竴鐪嬪氨鐭ラ亾濡備綍浣跨敤浜?/font>
(4)Leader/follower妯″紡綰跨▼pool瀹炵幇錛屼互鍙婂拰epoll鐨勯厤鍚?/font>
.....鏈畬鎴愶紝涓昏鏄閬垮厤榪囧鐨別poll_ctl璋冪敤,浠ュ強灝濊瘯浣跨敤EPOLLONESHOT鍔犻?.....
(5)benchmark
.......鏈畬鎴?/font>
褰撳湪C涓畾涔変簡涓涓粨鏋勭被鍨嬫椂錛屽畠鐨勫ぇ灝忔槸鍚︾瓑浜庡悇瀛楁(field)澶у皬涔嬪拰錛熺紪璇戝櫒灝嗗浣曞湪鍐呭瓨涓斁緗繖浜涘瓧孌碉紵ANSI C瀵圭粨鏋勪綋鐨勫唴瀛樺竷灞鏈変粈涔堣姹傦紵鑰屾垜浠殑紼嬪簭鍙堣兘鍚︿緷璧栬繖縐嶅竷灞錛熻繖浜涢棶棰樻垨璁稿涓嶅皯鏈嬪弸鏉ヨ榪樻湁鐐規ā緋婏紝閭d箞鏈枃灝辮瘯鐫鎺㈢┒瀹冧滑鑳屽悗鐨勭瀵嗐?
棣栧厛錛岃嚦灝戞湁涓鐐瑰彲浠ヨ偗瀹氾紝閭e氨鏄疉NSI C淇濊瘉緇撴瀯浣撲腑鍚勫瓧孌靛湪鍐呭瓨涓嚭鐜扮殑浣嶇疆鏄殢瀹冧滑鐨勫0鏄庨『搴忎緷嬈¢掑鐨勶紝騫朵笖絎竴涓瓧孌電殑棣栧湴鍧絳変簬鏁翠釜緇撴瀯浣撳疄渚嬬殑棣栧湴鍧銆傛瘮濡傛湁榪欐牱涓涓粨鏋勪綋錛?br>
struct vector{int x,y,z;} s;
int *p,*q,*r;
struct vector *ps;
p = &s.x;
q = &s.y;
r = &s.z;
ps = &s;
assert(p < q);
assert(p < r);
assert(q < r);
assert((int*)ps == p);
// 涓婅堪鏂█涓瀹氫笉浼氬け璐?/p>
榪欐椂錛屾湁鏈嬪弸鍙兘浼氶棶:"鏍囧噯鏄惁瑙勫畾鐩擱偦瀛楁鍦ㄥ唴瀛樹腑涔熺浉閭?"銆?鍞旓紝瀵逛笉璧鳳紝ANSI C娌℃湁鍋氬嚭淇濊瘉錛屼綘鐨勭▼搴忓湪浠諱綍鏃跺欓兘涓嶅簲璇ヤ緷璧栬繖涓亣璁俱傞偅榪欐槸鍚︽剰鍛崇潃鎴戜滑姘歌繙鏃犳硶鍕懼嫆鍑轟竴騫呮洿娓呮櫚鏇寸簿紜殑緇撴瀯浣撳唴瀛樺竷灞鍥撅紵鍝︼紝褰撶劧涓嶆槸銆備笉榪囧厛璁╂垜浠粠榪欎釜闂涓殏鏃舵娊韜紝鍏蟲敞涓涓嬪彟涓涓噸瑕侀棶棰樷斺斺斺斿唴瀛樺榻愩?/p>
璁稿瀹為檯鐨勮綆楁満緋葷粺瀵瑰熀鏈被鍨嬫暟鎹湪鍐呭瓨涓瓨鏀劇殑浣嶇疆鏈夐檺鍒訛紝瀹冧滑浼氳姹傝繖浜涙暟鎹殑棣栧湴鍧鐨勫兼槸鏌愪釜鏁発(閫氬父瀹冧負4鎴?)鐨勫嶆暟錛岃繖灝辨槸鎵璋撶殑鍐呭瓨瀵歸綈錛岃岃繖涓猭鍒欒縐頒負璇ユ暟鎹被鍨嬬殑瀵歸綈妯℃暟(alignment modulus)銆傚綋涓縐嶇被鍨婼鐨勫榻愭ā鏁頒笌鍙︿竴縐嶇被鍨婽鐨勫榻愭ā鏁扮殑姣斿兼槸澶т簬1鐨勬暣鏁幫紝鎴戜滑灝辯О綾誨瀷S鐨勫榻愯姹傛瘮T寮?涓ユ牸)錛岃岀ОT姣擲寮?瀹芥澗)銆傝繖縐嶅己鍒剁殑瑕佹眰涓鏉ョ畝鍖栦簡澶勭悊鍣ㄤ笌鍐呭瓨涔嬮棿浼犺緭緋葷粺鐨勮璁★紝浜屾潵鍙互鎻愬崌璇誨彇鏁版嵁鐨勯熷害銆傛瘮濡傝繖涔堜竴縐嶅鐞嗗櫒錛屽畠姣忔璇誨啓鍐呭瓨鐨勬椂鍊欓兘浠庢煇涓?鍊嶆暟鐨勫湴鍧寮濮嬶紝涓嬈¤鍑烘垨鍐欏叆8涓瓧鑺傜殑鏁版嵁錛屽亣濡傝蔣浠惰兘淇濊瘉double綾誨瀷鐨勬暟鎹兘浠?鍊嶆暟鍦板潃寮濮嬶紝閭d箞璇繪垨鍐欎竴涓猟ouble綾誨瀷鏁版嵁灝卞彧闇瑕佷竴嬈″唴瀛樻搷浣溿傚惁鍒欙紝鎴戜滑灝卞彲鑳介渶瑕佷袱嬈″唴瀛樻搷浣滄墠鑳藉畬鎴愯繖涓姩浣滐紝鍥犱負鏁版嵁鎴栬鎭板ソ妯法鍦ㄤ袱涓鍚堝榻愯姹傜殑8瀛楄妭鍐呭瓨鍧椾笂銆傛煇浜涘鐞嗗櫒鍦ㄦ暟鎹笉婊¤凍瀵歸綈瑕佹眰鐨勬儏鍐典笅鍙兘浼氬嚭閿欙紝浣嗘槸Intel鐨処A32鏋舵瀯鐨勫鐞嗗櫒鍒欎笉綆℃暟鎹槸鍚﹀榻愰兘鑳芥紜伐浣溿備笉榪嘔ntel濂夊姖澶у錛屽鏋滄兂鎻愬崌鎬ц兘錛岄偅涔堟墍鏈夌殑紼嬪簭鏁版嵁閮藉簲璇ュ敖鍙兘鍦板榻愩俉in32騫沖彴涓嬬殑寰蔣C緙栬瘧鍣?cl.exe for 80x86)鍦ㄩ粯璁ゆ儏鍐典笅閲囩敤濡備笅鐨勫榻愯鍒? 浠諱綍鍩烘湰鏁版嵁綾誨瀷T鐨勫榻愭ā鏁板氨鏄疶鐨勫ぇ灝忥紝鍗硈izeof(T)銆傛瘮濡傚浜巇ouble綾誨瀷(8瀛楄妭)錛屽氨瑕佹眰璇ョ被鍨嬫暟鎹殑鍦板潃鎬繪槸8鐨勫嶆暟錛岃宑har綾誨瀷鏁版嵁(1瀛楄妭)鍒欏彲浠ヤ粠浠諱綍涓涓湴鍧寮濮嬨侺inux涓嬬殑GCC濂夎鐨勬槸鍙﹀涓濂楄鍒?鍦ㄨ祫鏂欎腑鏌ュ緱錛屽茍鏈獙璇侊紝濡傞敊璇鎸囨):浠諱綍2瀛楄妭澶у皬(鍖呮嫭鍗曞瓧鑺傚悧?)鐨勬暟鎹被鍨?姣斿short)鐨勫榻愭ā鏁版槸2錛岃屽叾瀹冩墍鏈夎秴榪?瀛楄妭鐨勬暟鎹被鍨?姣斿long,double)閮戒互4涓哄榻愭ā鏁般?/p>
鐜板湪鍥炲埌鎴戜滑鍏沖績鐨剆truct涓婃潵銆侫NSI C瑙勫畾涓縐嶇粨鏋勭被鍨嬬殑澶у皬鏄畠鎵鏈夊瓧孌電殑澶у皬浠ュ強瀛楁涔嬮棿鎴栧瓧孌靛熬閮ㄧ殑濉厖鍖哄ぇ灝忎箣鍜屻傚棷錛熷~鍏呭尯錛熷錛岃繖灝辨槸涓轟簡浣跨粨鏋勪綋瀛楁婊¤凍鍐呭瓨瀵歸綈瑕佹眰鑰岄澶栧垎閰嶇粰緇撴瀯浣撶殑絀洪棿銆傞偅涔堢粨鏋勪綋鏈韓鏈変粈涔堝榻愯姹傚悧錛熸湁鐨勶紝ANSI C鏍囧噯瑙勫畾緇撴瀯浣撶被鍨嬬殑瀵歸綈瑕佹眰涓嶈兘姣斿畠鎵鏈夊瓧孌典腑瑕佹眰鏈涓ユ牸鐨勯偅涓鏉撅紝鍙互鏇翠弗鏍?浣嗘闈炲己鍒惰姹傦紝VC7.1灝變粎浠呮槸璁╁畠浠竴鏍蜂弗鏍?銆傛垜浠潵鐪嬩竴涓緥瀛?浠ヤ笅鎵鏈夎瘯楠岀殑鐜鏄疘ntel Celeron 2.4G + WIN2000 PRO + vc7.1錛屽唴瀛樺榻愮紪璇戦夐」鏄?榛樿"錛屽嵆涓嶆寚瀹?Zp涓?pack閫夐」):
typedef struct ms1
{
char a;
int b;
} MS1;
鍋囪MS1鎸夊涓嬫柟寮忓唴瀛樺竷灞(鏈枃鎵鏈夌ず鎰忓浘涓殑鍐呭瓨鍦板潃浠庡乏鑷沖彸閫掑):
_____________________________
| | |
| a | b |
| | |
+---------------------------+
Bytes: 1 4
鍥犱負MS1涓湁鏈寮哄榻愯姹傜殑鏄痓瀛楁(int)錛屾墍浠ユ牴鎹紪璇戝櫒鐨勫榻愯鍒欎互鍙夾NSI C鏍囧噯錛孧S1瀵硅薄鐨勯鍦板潃涓瀹氭槸4(int綾誨瀷鐨勫榻愭ā鏁?鐨勫嶆暟銆傞偅涔堜笂榪板唴瀛樺竷灞涓殑b瀛楁鑳芥弧瓚砳nt綾誨瀷鐨勫榻愯姹傚悧錛熷棷錛屽綋鐒朵笉鑳姐傚鏋滀綘鏄紪璇戝櫒錛屼綘浼氬浣曞閥濡欏畨鎺掓潵婊¤凍CPU鐨勭櫀濂藉憿錛熷懙鍛碉紝緇忚繃1姣鐨勮壈鑻︽濊冿紝浣犱竴瀹氬緱鍑轟簡濡備笅鐨勬柟妗堬細
_______________________________________
| |\\\\\\\\\\\| |
| a |\\padding\\| b |
| |\\\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 3 4
榪欎釜鏂規鍦╝涓巄涔嬮棿澶氬垎閰嶄簡3涓~鍏?padding)瀛楄妭錛岃繖鏍峰綋鏁翠釜struct瀵硅薄棣栧湴鍧婊¤凍4瀛楄妭鐨勫榻愯姹傛椂錛宐瀛楁涔熶竴瀹氳兘婊¤凍int鍨嬬殑4瀛楄妭瀵歸綈瑙勫畾銆傞偅涔坰izeof(MS1)鏄劇劧灝卞簲璇ユ槸8錛岃宐瀛楁鐩稿浜庣粨鏋勪綋棣栧湴鍧鐨勫亸縐誨氨鏄?銆傞潪甯稿ソ鐞嗚В錛屽鍚楋紵鐜板湪鎴戜滑鎶奙S1涓殑瀛楁浜ゆ崲涓涓嬮『搴?
typedef struct ms2
{
int a;
char b;
} MS2;
鎴栬浣犺涓篗S2姣擬S1鐨勬儏鍐佃綆鍗曪紝瀹冪殑甯冨眬搴旇灝辨槸
_______________________
| | |
| a | b |
| | |
+---------------------+
Bytes: 4 1
鍥犱負MS2瀵硅薄鍚屾牱瑕佹弧瓚?瀛楄妭瀵歸綈瑙勫畾錛岃屾鏃禷鐨勫湴鍧涓庣粨鏋勪綋鐨勯鍦板潃鐩哥瓑錛屾墍浠ュ畠涓瀹氫篃鏄?瀛楄妭瀵歸綈銆傚棷錛屽垎鏋愬緱鏈夐亾鐞嗭紝鍙槸鍗翠笉鍏ㄩ潰銆傝鎴戜滑鏉ヨ冭檻涓涓嬪畾涔変竴涓狹S2綾誨瀷鐨勬暟緇勪細鍑虹幇浠涔堥棶棰樸侰鏍囧噯淇濊瘉錛屼換浣曠被鍨?鍖呮嫭鑷畾涔夌粨鏋勭被鍨?鐨勬暟緇勬墍鍗犵┖闂寸殑澶у皬涓瀹氱瓑浜庝竴涓崟鐙殑璇ョ被鍨嬫暟鎹殑澶у皬涔樹互鏁扮粍鍏冪礌鐨勪釜鏁般傛崲鍙ヨ瘽璇達紝鏁扮粍鍚勫厓绱犱箣闂翠笉浼氭湁絀洪殭銆傛寜鐓т笂闈㈢殑鏂規錛屼竴涓狹S2鏁扮粍array鐨勫竷灞灝辨槸:
|<- array[1] ->|<- array[2] ->|<- array[3] .....
__________________________________________________________
| | | | |
| a | b | a | b |.............
| | | | |
+----------------------------------------------------------
Bytes: 4 1 4 1
褰撴暟緇勯鍦板潃鏄?瀛楄妭瀵歸綈鏃訛紝array[1].a涔熸槸4瀛楄妭瀵歸綈錛屽彲鏄痑rray[2].a鍛紵array[3].a ....鍛紵鍙榪欑鏂規鍦ㄥ畾涔夌粨鏋勪綋鏁扮粍鏃舵棤娉曡鏁扮粍涓墍鏈夊厓绱犵殑瀛楁閮芥弧瓚沖榻愯瀹氾紝蹇呴』淇敼鎴愬涓嬪艦寮?
___________________________________
| | |\\\\\\\\\\\|
| a | b |\\padding\\|
| | |\\\\\\\\\\\|
+---------------------------------+
Bytes: 4 1 3
鐜板湪鏃犺鏄畾涔変竴涓崟鐙殑MS2鍙橀噺榪樻槸MS2鏁扮粍錛屽潎鑳戒繚璇佹墍鏈夊厓绱犵殑鎵鏈夊瓧孌甸兘婊¤凍瀵歸綈瑙勫畾銆傞偅涔坰izeof(MS2)浠嶇劧鏄?錛岃宎鐨勫亸縐諱負0錛宐鐨勫亸縐繪槸4銆?/p>
濂界殑錛岀幇鍦ㄤ綘宸茬粡鎺屾彙浜嗙粨鏋勪綋鍐呭瓨甯冨眬鐨勫熀鏈噯鍒欙紝灝濊瘯鍒嗘瀽涓涓◢寰鏉傜偣鐨勭被鍨嬪惂銆?/p>
typedef struct ms3
{
char a;
short b;
double c;
} MS3;
鎴戞兂浣犱竴瀹氳兘寰楀嚭濡備笅姝g‘鐨勫竷灞鍥?
padding
|
_____v_________________________________
| |\| |\\\\\\\\\| |
| a |\| b |\padding\| c |
| |\| |\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 1 2 4 8
sizeof(short)絳変簬2錛宐瀛楁搴斾粠鍋舵暟鍦板潃寮濮嬶紝鎵浠鐨勫悗闈㈠~鍏呬竴涓瓧鑺傦紝鑰宻izeof(double)絳変簬8錛宑瀛楁瑕佷粠8鍊嶆暟鍦板潃寮濮嬶紝鍓嶉潰鐨刟銆乥瀛楁鍔犱笂濉厖瀛楄妭宸茬粡鏈? bytes錛屾墍浠鍚庨潰鍐嶅~鍏?涓瓧鑺傚氨鍙互淇濊瘉c瀛楁鐨勫榻愯姹備簡銆俿izeof(MS3)絳変簬16錛宐鐨勫亸縐繪槸2錛宑鐨勫亸縐繪槸8銆傛帴鐫鐪嬬湅緇撴瀯浣撲腑瀛楁榪樻槸緇撴瀯綾誨瀷鐨勬儏鍐?
typedef struct ms4
{
char a;
MS3 b;
} MS4;
MS3涓唴瀛樿姹傛渶涓ユ牸鐨勫瓧孌墊槸c錛岄偅涔圡S3綾誨瀷鏁版嵁鐨勫榻愭ā鏁板氨涓巇ouble鐨勪竴鑷?涓?)錛宎瀛楁鍚庨潰搴斿~鍏?涓瓧鑺傦紝鍥犳MS4鐨勫竷灞搴旇鏄?
_______________________________________
| |\\\\\\\\\\\| |
| a |\\padding\\| b |
| |\\\\\\\\\\\| |
+-------------------------------------+
Bytes: 1 7 16
鏄劇劧錛宻izeof(MS4)絳変簬24錛宐鐨勫亸縐葷瓑浜?銆?/p>
鍦ㄥ疄闄呭紑鍙戜腑錛屾垜浠彲浠ラ氳繃鎸囧畾/Zp緙栬瘧閫夐」鏉ユ洿鏀圭紪璇戝櫒鐨勫榻愯鍒欍傛瘮濡傛寚瀹?Zpn(VC7.1涓璶鍙互鏄?銆?銆?銆?銆?6)灝辨槸鍛婅瘔緙栬瘧鍣ㄦ渶澶у榻愭ā鏁版槸n銆傚湪榪欑鎯呭喌涓嬶紝鎵鏈夊皬浜庣瓑浜巒瀛楄妭鐨勫熀鏈暟鎹被鍨嬬殑瀵歸綈瑙勫垯涓庨粯璁ょ殑涓鏍鳳紝浣嗘槸澶т簬n涓瓧鑺傜殑鏁版嵁綾誨瀷鐨勫榻愭ā鏁拌闄愬埗涓簄銆備簨瀹炰笂錛孷C7.1鐨勯粯璁ゅ榻愰夐」灝辯浉褰撲簬/Zp8銆備粩緇嗙湅鐪婱SDN瀵硅繖涓夐」鐨勬弿榪幫紝浼氬彂鐜板畠閮戦噸鍛婅浜嗙▼搴忓憳涓嶈鍦∕IPS鍜孉lpha騫沖彴涓婄敤/Zp1鍜?Zp2閫夐」錛屼篃涓嶈鍦?6浣嶅鉤鍙頒笂鎸囧畾/Zp4鍜?Zp8(鎯蟲兂涓轟粈涔堬紵)銆傛敼鍙樼紪璇戝櫒鐨勫榻愰夐」錛屽鐓х▼搴忚繍琛岀粨鏋滈噸鏂板垎鏋愪笂闈?縐嶇粨鏋勪綋鐨勫唴瀛樺竷灞灝嗘槸涓涓緢濂界殑澶嶄範銆?/p>
鍒頒簡榪欓噷錛屾垜浠彲浠ュ洖絳旀湰鏂囨彁鍑虹殑鏈鍚庝竴涓棶棰樹簡銆傜粨鏋勪綋鐨勫唴瀛樺竷灞渚濊禆浜嶤PU銆佹搷浣滅郴緇熴佺紪璇戝櫒鍙婄紪璇戞椂鐨勫榻愰夐」錛岃屼綘鐨勭▼搴忓彲鑳介渶瑕佽繍琛屽湪澶氱騫沖彴涓婏紝浣犵殑婧愪唬鐮佸彲鑳借琚笉鍚岀殑浜虹敤涓嶅悓鐨勭紪璇戝櫒緙栬瘧(璇曟兂浣犱負鍒漢鎻愪緵涓涓紑鏀炬簮鐮佺殑搴?錛岄偅涔堥櫎闈炵粷瀵瑰繀闇錛屽惁鍒欎綘鐨勭▼搴忔案榪滀篃涓嶈渚濊禆榪欎簺璇″紓鐨勫唴瀛樺竷灞銆傞『渚胯涓涓嬶紝濡傛灉涓涓▼搴忎腑鐨勪袱涓ā鍧楁槸鐢ㄤ笉鍚岀殑瀵歸綈閫夐」鍒嗗埆緙栬瘧鐨勶紝閭d箞瀹冨緢鍙兘浼氫駭鐢熶竴浜涢潪甯稿井濡欑殑閿欒銆傚鏋滀綘鐨勭▼搴忕‘瀹炴湁寰堥毦鐞嗚В鐨勮涓猴紝涓嶉槻浠旂粏媯鏌ヤ竴涓嬪悇涓ā鍧楃殑緙栬瘧閫夐」銆?/p>
鎬濊冮:璇峰垎鏋愪笅闈㈠嚑縐嶇粨鏋勪綋鍦ㄤ綘鐨勫鉤鍙頒笂鐨勫唴瀛樺竷灞錛屽茍璇曠潃瀵繪壘涓縐嶅悎鐞嗗畨鎺掑瓧孌靛0鏄庨『搴忕殑鏂規硶浠ュ敖閲忚妭鐪佸唴瀛樼┖闂淬?/p>
A. struct P1 { int a; char b; int c; char d; };
B. struct P2 { int a; char b; char c; int d; };
C. struct P3 { short a[3]; char b[3]; };
D. struct P4 { short a[3]; char *b[3]; };
E. struct P5 { struct P2 *a; char b; struct P1 a[2]; };
鍙傝冭祫鏂?
銆?銆戙婃繁鍏ョ悊瑙h綆楁満緋葷粺(淇鐗?銆嬶紝
(钁?Randal E.Bryant; David O'Hallaron錛?br> (璇?榫氬鍒?闆瘋繋鏄ワ紝
涓浗鐢靛姏鍑虹増紺撅紝2004
銆?銆戙奀: A Reference Manual銆?褰卞嵃鐗?錛?br> (钁?Samuel P.Harbison; Guy L.Steele錛?br> 浜烘皯閭數鍑虹増紺撅紝2003