锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久一区精品,欧美日韩视频免费播放,亚洲小说春色综合另类电影http://m.shnenglu.com/guojingjia2006/category/14893.htmlPay it forword - 鎴戝茍涓嶈鐨勮嚜璞紝鎴戞墍灝濊瘯鐨勪簨鎯呴兘澶辮觸浜喡仿仿仿仿仿蜂範鎯師鏈敓媧葷殑浜轟笉瀹規槗鏀瑰彉錛屽氨綆楃幇鐘跺緢緋燂紝浠栦滑涔熷緢闅炬敼鍙橈紝鍦ㄨ繃紼嬩腑錛屼粬浠繕鏄斁寮冧簡路路路路路路浠栦滑涓鏀懼純錛屽ぇ瀹跺氨閮芥槸杈撳路路路路路路璁╃埍浼犲嚭鍘伙紝寰堝洶闅撅紝涔熸棤娉曢鏂欙紝浜轟滑闇瑕佹洿緇嗗績鐨勮瀵熷埆浜猴紝瑕侀殢鏃舵敞鎰忔墠鑳戒繚鎶ゅ埆浜猴紝鍥犱負浠栦滑鏈繀鐭ラ亾鑷繁瑕佷粈涔埪仿仿仿仿?/description>zh-cnFri, 11 Jan 2013 11:21:12 GMTFri, 11 Jan 2013 11:21:12 GMT60Centos緙栬瘧boosthttp://m.shnenglu.com/guojingjia2006/archive/2013/01/07/197075.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Mon, 07 Jan 2013 08:38:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2013/01/07/197075.htmlhttp://m.shnenglu.com/guojingjia2006/comments/197075.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2013/01/07/197075.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/197075.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/197075.htmlhttp://blog.sina.com.cn/s/blog_6f2caee40100uhj6.html
1.涓嬭澆鏈鏂扮殑boost
http://www.boost.org/
2.瑙e帇鏂囦歡
tar -xzvf boost_1_45_0.tar.gz 
3.緙栬瘧bjam
榪涘叆boost_1_45_0鐩綍涓紝榪愯./bootstrap.sh錛屽畬鎴愬悗浼氬緱鍒頒竴涓猙jam
4.緙栬瘧boost 
./bjam --with-date_time --with-system --with-regex --with-thread --with-filesystem --with-serialization --with-iostreams --with-math --with-mpi --with-program_options --with-python --with-math --with-signals --layout=tagged install variant=debug,release link=static --runtime-link=static threading=multi stage
5.鏌ョ湅boost
緙栬瘧瀹屾垚鍚庯紝鍦?usr/local/include/boost灝辨湁鏈鏂扮殑boost澶存枃浠朵簡錛屽湪/usr/local/lib灝辨湁緙栬瘧濂界殑.a搴撴枃浠朵簡銆?/div>
铏界劧usr/local/include鍜?usr/include閮芥湁鐩綍錛屼絾GCC鏄厛璁塊棶/usr/local/include錛屾墍浠ョ紪璇戝畬鎴愬悗錛屽氨鍙互榛樿浣跨敤boost浜嗐?/div>
6.嫻嬭瘯boost
vi testboost.cpp
#include <iostream>
#include <boost/version.hpp>
int main()
{
    std::cout<<BOOST_VERSION<<std::endl;
    return 0;
}
緙栬瘧:g++ -o testboost testboost.cpp


]]>mint 涓媍odeblocks 緙栬瘧libapue http://m.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Fri, 04 Jan 2013 12:23:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.htmlhttp://m.shnenglu.com/guojingjia2006/comments/196955.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/196955.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/196955.html浜庢槸涔庝笅浜嗕竴涓紝鐢變簬鏄箮鎯沖啓鍑犱釜sample鐜╃帺銆備簬鏄箮鎷?lt;unix 楂樼駭鐜緙栫▼> sample鏉ユ祴璇曘?br />
浜庢槸涔庡緩浜嗕竴涓猚++ project.
<unix 楂樼駭鐜緙栫▼>閲岀殑渚嬪瓙鏈変釜apue.h澶存枃浠躲備笉鏄郴緇熻嚜甯︾殑銆傛槸浣滆呰嚜宸卞啓鐨勫嚑涓猽til鍑芥暟銆?br />緗戜笂鎵劇紪璇慳pue.h澶存枃浠朵竴澶х墖銆備絾鏄兘鏄冩潵鑰冨幓錛屼笉榪囨牳蹇冪殑閮藉樊涓嶅銆備笉榪囨湁涓柟娉曟槸緙栬瘧瀹?br />libapue.a闈欐佸簱鍚庯紝榪橀渶瑕佸湪apute.h澶存枃浠跺熬宸村姞"error.c"銆傘傚畬浜嗘嫹璐漞rror.c瀹炵幇鍒扮洰褰曘傘?br />鐪嬪畬鍚庛傛垜鎯婁簡鍛嗐傘傚ソ鍚с傘傝繖搴撹繕鑳借繖涔堢敤銆傘?br />
鏃㈢劧libapue.a緙栬瘧瀹屽悗錛宎pue.h閲岀殑鍑芥暟澹版槑鍦╨ibapue.a閮藉凡緇忓疄鐜幫紝褰撶劧鍖呮嫭err_xxx緋誨垪鐨勩傛墍浠?br />鍦╝pue.h鍔?error.c"鏄敾铔囨坊瓚熾傘傝繖閲屼笉鎺ㄨ崘姝ゆ柟娉曘傘?br />
鎴戠殑鐜鏄痬int14涓? IDE鐢ㄧ殑鏄?codeblocks. 鏂規硶涓熀鏈兘鏈夎繖涔堜竴涓楠わ細
鍏堝湪榪欎釜緗戠珯 http://www.apuebook.com/src.tar.gz 涓嬭澆tar.gz鏍煎紡鐨勬簮鐮佸寘錛岀劧鍚庤В鍘嬭嚦鏌愪釜鐩綍錛屾瘮濡傝/home/xiaoguozi/涓嬶紝鐒跺悗榪涘叆鐩綍apue.2e錛屾妸鏂囦歡 Make.defines.linux 涓殑 WKDIR=/home/xxx/apue.2e 淇敼涓? WKDIR=/home/xiaoguozi/apue.2e 錛岀劧鍚庡啀榪涘叆apue.2e鐩綍涓嬬殑std鐩綍錛屾墦寮linux.mk錛屽皢閲岄潰鐨刵awk鍏ㄩ儴鏇挎崲涓篴wk
濡傛灉鐢╲im緙栬緫鐨勮瘽錛屽彲浠ョ敤 :1,%s/nawk/awk/g 鏇挎崲瀛楃紿?br />
瀹屼簡make, 榪囩▼涓紝榪橀亣鍒頒簡鍑犱釜闂銆?mint涓?鍏朵粬os涓嶅お娓呮)

1: /usr/include/bits/timex.h:31:7:error: expect ':' , ',' , ';' , '}' or '__attribute__'   
 apue.2e/ipp/ipp.h涓?#define status u.st 涓?timex.h涓殑 status 鍐茬獊錛屾洿鏀?#define Status u.st

  

2錛欰RG_MAX 鏈畾涔?/span>

   鍦╥nclude/apue.h涓姞鍏?#define ARG_MAX 4096

   鍦╰hreadctl/getenv1.c 鍔犲叆 #include "../include/apue.h"

   鍦╰hreadctl/getenv3.c 鍔犲叆 #include "../include/apue.h"

瀹屼簡涔嬪悗錛宮ake搴旇灝卞彲浠ユ垚鍔熶簡

瀹屼簡鍦╟odeblocks欏圭洰閲屽紩鐢ㄥ垰緙栬瘧瀹岀殑搴擄紝鏈夊嚑涓柟娉?
1)灝嗙紪璇戝畬鐨勫簱,澶存枃浠禷pue.h鎷瘋礉/usr/include,搴撴枃浠秎ibapue.a鎷瘋礉鍒?usr/lib涓嬶紝榪欎釜鏄郴緇熺洰褰曪紝gcc緙栬瘧鐨勬椂鍊欎細鍦ㄨ繖鐩綍鎼滃
2)鍦ㄩ」鐩睘鎬ф坊鍔犻潤鎬佸簱寮曠敤
娣誨姞澶存枃浠訛細渚濇鐐瑰嚮project->bulid options->Search directories錛屽湪璇ユ爣絳鵑〉涓偣鍑籆ompiler錛屽崟鍑籄dd鎸夐挳娣誨姞澶存枃浠惰礬寰?br />娣誨姞闈欐佸簱璺緞錛氫緷嬈$偣鍑籶roject->bulid options->Linker setting錛屽湪璇ユ爣絳鵑〉涓偣鍑籄dd鎸夐挳娣誨姞闈欐佸簱璺緞銆?br />
濡傛灉涔嬪墠浣犲緩鐨勬槸c project鐨勮瘽錛屽簲璇ュ氨鍙互欏哄埄緙栬瘧閫氳繃浜嗭紝浣嗘槸瀵逛簬寤虹珛c++鐨刾roject,浠嶇劧鎻愮ず閾炬帴閿欒錛屾壘涓嶅埌鍑芥暟瀹炵幇錛?br />鍘熷洜鏄痩ibapue.a鏄痗搴擄紝鐢╣++緙栬瘧鐨勬椂鍊欒寮曠敤c搴撶殑璇濓紝鍥犱負c++緙栬瘧鐨勬椂鍊欎細鍦ㄥ嚱鏁板姞涓浜涢澶栧瓧絎︼紝鎵浠ュ綋鐒朵細閾炬帴閿欒銆?/div>
瑙e喅涔熺畝鍗曠殑鍦ㄥ嚱鏁板簱鍓嶅姞 extern "C",鎴栬呯洿鎺ユ妸apue.h鐢╡xtern "C"鍖呭惈錛屼笉娓呮鐨勮ˉ涓嬬浉搴旂煡璇嗐?br />
鍔犵偣棰濆鐨勭煡璇嗗叧浜巊cc/g++錛?br />
gcc鍜実++鐨勫尯鍒?p>璇尯涓:gcc鍙兘緙栬瘧c浠g爜,g++鍙兘緙栬瘧c++浠g爜
涓よ呴兘鍙互錛屼絾鏄娉ㄦ剰錛?br />1.鍚庣紑涓?c鐨勶紝gcc鎶婂畠褰撲綔鏄疌紼嬪簭錛岃実++褰撲綔鏄痗++紼嬪簭錛涘悗緙涓?cpp鐨勶紝涓よ呴兘浼氳涓烘槸c++紼嬪簭錛屾敞鎰忥紝铏界劧c++鏄痗鐨勮秴闆嗭紝浣嗘槸涓よ呭璇硶鐨勮姹傛槸鏈夊尯鍒殑銆侰++鐨勮娉曡鍒欐洿鍔犱弗璋ㄤ竴浜涖?br />2.緙栬瘧闃舵錛実++浼氳皟鐢╣cc錛屽浜巆++浠g爜錛屼袱鑰呮槸絳変環鐨勶紝浣嗘槸鍥犱負gcc鍛戒護涓嶈兘鑷姩鍜孋錛嬶紜紼嬪簭浣跨敤鐨勫簱鑱旀帴錛屾墍浠ラ氬父鐢╣++鏉ュ畬鎴愰摼鎺ワ紝涓轟簡緇熶竴璧瘋錛屽共鑴嗙紪璇?閾炬帴緇熺粺鐢╣++浜嗭紝榪欏氨緇欎漢涓縐嶉敊瑙夛紝濂藉儚cpp紼嬪簭鍙兘鐢╣++浼肩殑銆?br />
璇尯浜?gcc涓嶄細瀹氫箟__cplusplus瀹忥紝鑰実++浼?br />瀹為檯涓婏紝榪欎釜瀹忓彧鏄爣蹇楃潃緙栬瘧鍣ㄥ皢浼氭妸浠g爜鎸塁榪樻槸C++璇硶鏉ヨВ閲婏紝濡備笂鎵榪幫紝濡傛灉鍚庣紑涓?c錛屽茍涓旈噰鐢╣cc緙栬瘧鍣紝鍒欒瀹忓氨鏄湭瀹氫箟鐨勶紝鍚﹀垯錛屽氨鏄凡瀹氫箟銆?br />
璇尯涓?緙栬瘧鍙兘鐢╣cc錛岄摼鎺ュ彧鑳界敤g++
涓ユ牸鏉ヨ錛岃繖鍙ヨ瘽涓嶇畻閿欒錛屼絾鏄畠娣鋒穯浜嗘蹇碉紝搴旇榪欐牱璇達細緙栬瘧鍙互鐢╣cc/g++錛岃岄摼鎺ュ彲浠ョ敤g++鎴栬単cc -lstdc++銆傚洜涓篻cc鍛戒護涓嶈兘鑷姩鍜孋錛嬶紜紼嬪簭浣跨敤鐨勫簱鑱旀帴錛屾墍浠ラ氬父浣跨敤g++鏉ュ畬鎴愯仈鎺ャ備絾鍦ㄧ紪璇戦樁孌碉紝g++浼氳嚜鍔ㄨ皟鐢╣cc錛屼簩鑰呯瓑浠楓?/p> gcc鍜実++鐨勫尯鍒? 鎴戜滑鍦ㄧ紪璇慶/c++浠g爜鐨勬椂鍊欙紝鏈変漢鐢╣cc錛屾湁浜虹敤g++錛屼簬鏄悇縐嶈娉曢兘鏉ヤ簡錛岃濡俢浠g爜鐢╣cc錛岃宑++浠g爜鐢╣++錛屾垨鑰呰緙栬瘧鐢? gcc錛岄摼鎺ョ敤g++錛屼竴鏃朵篃涓嶇煡鍝釜璇存硶姝g‘錛屽鏋滃啀閬囦笂涓猠xtern "C"錛屽垎姝у氨鏇村浜嗭紝榪欓噷鎴戞兂浣滀釜浜嗙粨錛屾瘯绔熺煡璇嗙殑鐩殑鏄護浜烘洿娓呴啋錛岃屼笉鏄洿緋婃秱銆?/div>



]]>Installing Gearman and gearmand on Windows with Cygwin http://m.shnenglu.com/guojingjia2006/archive/2012/12/28/196743.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Fri, 28 Dec 2012 03:17:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2012/12/28/196743.htmlhttp://m.shnenglu.com/guojingjia2006/comments/196743.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2012/12/28/196743.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/196743.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/196743.html

Recently I've come face-to-face with a significant processing task for a web application written in PHP.  I haven't worked with process control very much, so I started researching ways of distributing the calculations to multiple processes.  PHP offers several libraries for doing this (pcntl, POSIX), but it quickly became clear that if you're running Windows these libraries are not an option, and unfortunately at work I have a Windows machine.  After a lot more research, I came across Gearman.

Gearman is essentially a distributed processing framework, and seems to have community support for many programming languages.  It consists of two main components: the job server, and a Client and Worker API.  The Client and Worker API can be used in a wide variety of languages, but the job server is only available as a C library or a Perl library.  This makes it a bit tougher to get the server running on Windows, especially when you start running into some of the dependencies that it requires to build.  As well, the Client/Worker API for PHP can only be installed as a PECL extension, or a very-out-of-date PEAR extension called Net_Gearman.

Nonetheless, after yet more research I decided that I would give it a shot by using Cygwin to get the job server running (if you haven't used Cygwin before, be sure to read about it before attempting to install Gearman this way), and PEAR to use the API.  Pre-built PECL extensions aren't available for Windows anymore, and the build process for PHP extensions can be pretty painful, so it makes PEAR look good by comparison even if the code will be out of date.

I had a pretty frustrating time finally getting everything up and running due to various dependency issues, so I went back through the whole process and wrote it out step-by-step.  I used a Windows XP SP3 machine for this, but I also got it working on a Windows 7 machine as well.

Installing the Gearman job server (gearmand) on Windows with Cygwin

Installing Cygwin

  1. If you don't have Cygwin already, you can get it from http://www.cygwin.com.  The setup file is located here, and the setup process is pretty straightforward; run it and follow the wizard.  Full installation instructions are available at the Cygwin site.
  2. Keep the Cygwin setup.exe file handy after you've installed the default software packages, as you'll need it in the future to add packages, similar to apt-get, yum, and other Linux/UNIX package managers.
  3. Cygwin installs with some basic packages, including a Cygwin Bash Shell that goes into your Start Menu.  I prefer the mintty emulator instead, as it has less of a DOS Command Prompt feel and better terminal features.  Feel free to use whatever shell you like of course.  You can get mintty by re-running the setup.exe, and at the package selection screen, type 'mintty' into the Search bar at the top left.  Expand the "Shells" category, and click on the word "Skip" under the "New" column beside the mintty package to select it before continuing the install process.

Installing Cygwin Package Dependencies needed for Gearman

If you're not already in the Cygwin setup, re-run the Cygwin setup.exe and go through to the package selection screen.  The following is a list of dependency packages you will need in order to build the Gearman job server (gearmand).  None of these packages were installed by default with Cygwin:

  • gcc
  • make
  • libuuid1-devel
  • libiconv

There's a good installation tutorial here that walks through getting gcc and make installed for people unfamiliar with Cygwin.  Finding the others is pretty straightforward, the Search bar in the package selector works well.

Installing libevent

Gearmand requires an event notification library called libevent that you cannot get as a Cygwin package, which means it has to be installed from source.  You can get the source here.

  1. Download and unpack the latest libevent stable release.  At the time of this writing, I used libevent-1.4.14b-stable.
    NOTE: Download and unpack to a directory that does not contain spaces in the name, such as "C:/cygwin/home/Zombat/libevent-1.4.14b-stable".  If you unpack to something with spaces like "C:/Documents and Settings/Zombat/", the build process might not be able to install libevent correctly (libtool has a hard time with spaces)!
  2. Open a Cygwin shell and cd to the unpacked libevent directory.
  3. Run the following commands:

./configure
make
make install

libevent should now be installed and ready to be used when compiling the Gearman job server.

Installing the Gearman job server, gearmand.exe

  1. Download and unpack the C implementation of gearmand from http://gearman.org/index.php?id=download
  2. Open a cygwin shell and cd to your unpacked gearmand directory.  Same rules apply as before, make sure you've unpacked in a directory with no spaces in the path!  libtool hates that, and your build may fail.
  3. Run the following commands:

./configure
make
make install

The Gearman job server should now be installed and ready to use!  Mine was installed at /usr/local/sbin/gearmand.exe, and running it with a "triple verbose" flag (-vvv) should produce the following:

gearmand.exe startup debug output

That's it for the job server.  When you want to start it, simply open a Cygwin shell and run gearmand.exe.  Running it with the -d flag will cause the server to run as a daemon in the background, and running with --help will show you the full option list.

Installing the Gearman Client and Worker API (Net_Gearman)

I chose to install the PEAR Client and Worker API, as it is native PHP and doesn't involve compiling PECL extensions.  The PEAR package is called Net_Gearman, and was originally written by Joe Stump at Digg.com.  It is old and out of date now, although there appears to be a more recent fork at http://github.com/brianlmoon/net_gearman.  I stuck with the older version, as I suspect it will meet my needs, and was readily available as a PEAR package.

This also makes installation relatively painless.  Assuming you've previously set PEAR up, then all you have to do is open a command window (not a Cygwin shell) and run:

pear install Net_Gearman-alpha

The "-alpha" portion is necessary, as Net_Gearman apparently never made it to a stable release version.  That being said, it has functioned well for me so far.  Perhaps someone will pick the project up in the future.

I'll write more about getting started with the Client and Worker API in the next article, so we can actually use Gearman to get some work done.

杞嚜:
http://www.phpvs.net/2010/11/30/installing-gearman-and-gearmand-on-windows-with-cygwin/


]]>aio,epoll,libevent,boost::asio瑙e喅鐨勯棶棰?/title><link>http://m.shnenglu.com/guojingjia2006/archive/2012/11/09/194979.html</link><dc:creator>灝忔灉瀛?/dc:creator><author>灝忔灉瀛?/author><pubDate>Fri, 09 Nov 2012 07:56:00 GMT</pubDate><guid>http://m.shnenglu.com/guojingjia2006/archive/2012/11/09/194979.html</guid><wfw:comment>http://m.shnenglu.com/guojingjia2006/comments/194979.html</wfw:comment><comments>http://m.shnenglu.com/guojingjia2006/archive/2012/11/09/194979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/guojingjia2006/comments/commentRss/194979.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/guojingjia2006/services/trackbacks/194979.html</trackback:ping><description><![CDATA[<div> aio鏄痩inux2.6浠ュ悗鍐呮牳瀹炵幇鐨勫紓姝O錛屾垨鑰呰浠栨墠鏄湡姝f剰涔変笂鐨勫紓姝O銆?br /> epoll浣滀負select鐨刲inux鐨勬浛浠e搧錛岃В鍐充簡selectfd_set鐨勯檺鍒躲傛ц兘浼樹簬select銆傝屽湪max騫沖彴涓婃浛浠f柟妗堟槸kqueue銆?br /> libevent鏄竴涓法騫沖彴寮傛瑙e喅鏂規錛屼粬鏍規嵁涓嶅悓鐨勫鉤鍙版彁渚涗簡涓嶅悓鐨勫紓姝ユ柟妗堬紝閲囩敤Reactor妯″瀷瀹炵幇銆?br /> Boost::asio鏄竴涓法騫沖彴鐨勭綉緇滃強搴曞眰IO鐨凜++<a target="_blank">緙栫▼</a>搴擄紝瀹炵幇浜嗗TCP銆乁DP銆両CMP銆佷覆鍙g殑鏀寔銆傚浜庤鍐欐柟寮忥紝ASIO鏀寔鍚屾鍜屽紓姝ヤ袱縐嶆柟寮忋傞噰鐢ㄤ簡epoll鏉ュ疄鐜幫紝鎻掑叆浜嗗ぇ閲忕殑淇″彿澶勭悊銆侫sio搴撲笉闇瑕佸崟鐙究浜庯紝浣嗘槸嫻嬭瘯榪囩▼涓boost::system鐨勪緷璧栧彲鑳戒細闇瑕佺紪璇戦儴鍒哹oost涓殑搴撱?br /> muduo閲囩敤Reactor妯″瀷瀹炵幇鐨勭綉緇滃簱錛屽彧鏀寔<a target="_blank">Linux</a> 2.6.x涓嬬殑騫跺彂闈為樆濉濼CP緗戠粶緙栫▼錛屼笉璺ㄥ鉤鍙幫紝涓嶆敮鎸乽dp鍜宨pv6銆傚悶鍚愰噺鏂歸潰muduo姣攍ibevent2蹇?8%錛屽湪浜嬩歡澶勭悊鏁堢巼鏂?闈紝muduo涓巐ibevent2鎬諱綋姣旇緝鎺ヨ繎錛宮uduo鍚炲悙閲忔瘮boost.asio楂?5%浠ヤ笂銆傛ц兘鏂歸潰浣滀負瑙e喅澶ф暟鎹悶鍚愰噺寰堟湁浼樺娍錛屼絾鏄 騫沖彴鍜岀綉緇滃崗璁敮鎸佹柟闈㈡槸涓涓棶棰樸?br /> ACE涔熸槸寰堢粡鍏哥殑緗戠粶搴擄紝鍑鴻嚜銆奀++緗戠粶緙栫▼銆嬩綔鑰呬箣鎵嬶紝璁捐綺懼紼嬪害鍫О涓嫻侊紝鏀寔鍗忚鑼冨洿涔熷緢騫匡紝浣嗘槸浣跨敤澶嶆潅搴﹀拰瀛︿範澶嶆潅搴﹁緝楂橈紝涓鐩存湁“瀛︽垜鑰呯敓錛岀敤鎴戣呮”鐨勮瘎浠楓?br /> 闇瑕佹敞鎰忕殑鏄粬浠殑瀹氫綅涓嶅悓錛宎io鍜宔poll涓昏鏄寮傛鎻愪緵瑙e喅鏂規涓嶆槸緗戠粶搴撲笉鎻愪緵緗戠粶鏀寔錛岃宭ibevent涔熸槸涓昏瑙e喅IO鐨勯棶棰樺彧鎻愪緵綆鍗曠殑http鏀寔錛宎sio鍜宮uduo榪樻湁ACE涓鏍鋒槸楂樻ц兘緗戠粶搴撱?/div><img src ="http://m.shnenglu.com/guojingjia2006/aggbug/194979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guojingjia2006/" target="_blank">灝忔灉瀛?/a> 2012-11-09 15:56 <a href="http://m.shnenglu.com/guojingjia2006/archive/2012/11/09/194979.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍏嶈垂鐨凜++鍥懼艦鍜屾父鎴忓簱http://m.shnenglu.com/guojingjia2006/archive/2012/06/15/178934.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Fri, 15 Jun 2012 06:29:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2012/06/15/178934.htmlhttp://m.shnenglu.com/guojingjia2006/comments/178934.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2012/06/15/178934.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/178934.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/178934.htmlShare

C++ is a multi paradigm, free form complied, general purpose and thus a very powerful language used basically forthe purpose of programming. This language is regarded as an intermediatelevel language .The main reason for this is that it consists of both high level as well aslow level features.

It is one of the most popularprogramming languages due to many reasons. It has application domains which include system software, device drivers, application software and many other including client applications and entertainment software of which the best example is a video game.

In this list we introduces some highly useful C++ graphics and game libraries. These libraries has provides a great interface to add these functionality to their project or application easily. C++ users would love to use these libraries for their next project.

Today we are going to share C++ graphic and games Libraries for developers, i hope these libraries would help developers a lot in their next project to make impressive and attractive layout for theirnest applications. Visit this list and share your thought in our comment section below.

1) Antigrain

Anti-Grain Geometry (AGG) is an Open Source, free of charge graphic library, written in industrially standard C++. The terms and conditions of use AGG are described on The License page. AGG doesn’t depend on any graphic API or technology. Basically, you can think of AGG as of a rendering engine that produces pixel images in memory from some vectorial data.

2) Amanith

AmanithVG SRE is a pure software solution that grants a superlative vector graphics quality without to sacrifice performance on any kind of architecture / platform. Thanks to its original polygon rasterization algorithm and dedicated optimized scanline fillers, this engine constitues the fastest OpenVG software rendering solution available on the market.

3) Codehead

4) Oscilloscope Lib

5) Lib SDL

Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. It is used by MPEG playback software, emulators, and many popular games, including the award winning Linux port of “Civilization: Call To Power.”

6) Ogre 3d

OGRE (Object-Oriented Graphics Rendering Engine) is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce applications utilising hardware-accelerated 3D graphics. The class library abstracts all the details of using the underlying system libraries like Direct3D and OpenGL and provides an interface based on world objects and other intuitive classes.

杞嚜:

http://zoomzum.com/6-free-c-graphics-and-game-libraries/



]]>
c/c++閫氱敤鍐呭瓨娉勬紡媯嫻嬫鏋禛MFD(General Memory Fault Detection Framework)http://m.shnenglu.com/guojingjia2006/archive/2012/01/16/164246.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Mon, 16 Jan 2012 05:03:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2012/01/16/164246.htmlhttp://m.shnenglu.com/guojingjia2006/comments/164246.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2012/01/16/164246.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/164246.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/164246.html1 鑳屾櫙錛?/span>
       x86騫沖彴鏈夊畬鍠勭殑鐢ㄦ埛鎬佹嫻嬪唴瀛樺伐鍏鋒瘮濡倂algrind絳夛紝鍙互鐩戞帶紼嬪簭榪愯涓緇嗙殑鍐呭瓨淇℃伅錛屼粠鑰岀簿紜畾浣嶅唴瀛橀棶棰樸傜劧鑰岄殢鐫鏂板鉤鍙扮殑蹇熻癁鐢燂紙姣斿Tilera鐨凾ilePro64 CPU)錛岃繖浜涘伐鍏蜂笉鑳借鍙婃椂鍦扮Щ妞嶏紝瀵艱嚧鏂板鉤鍙扮己涔忕浉搴旂殑鎵嬫鏉ュ畾浣嶅唴瀛橀敊璇紝濡傚唴瀛樿秺鐣岋紝娉勬紡絳夛紝鑰屽彧鑳戒嬌鐢ㄧ矖綺掑害鐨勬柟娉晅op錛宖ree 絳夋寚浠よ瀵熻繘紼嬬殑鍔ㄦ佸唴瀛樻婚銆傚叾緙虹偣鏄矑搴﹀お綺楋紝鑰屼笖鍐呭瓨鐨勬繪暟鍙樺寲鏈夊緢澶氬師鍥犲紩璧鳳紝鍦ㄥ鏉傜殑緋葷粺閲岋紝寰堥毦綺劇‘瀹氫綅鍐呭瓨闂鐨勬牴婧愶紝鐢氳嚦浼氭紡鎶ラ敊鎶ワ紝榪欎弗閲嶅獎鍝嶄簡鏂板鉤鍙幫紙濡俆ilera)寮鍙戜笌嫻嬭瘯鐨勬晥鐜囥傞拡瀵硅繖涓棶棰橈紝鎴戜滑鎻愬嚭浜嗕竴涓氱敤鐨勬柊騫沖彴閽堝c/c++鍐呭瓨閿欒媯嫻嬫鏋躲?br />       璇ユ鏋跺彲閫傜敤浜庝換浣曞鉤鍙般傚叾閫氳繃閲嶅啓鏍囧噯搴撶殑鍐呭瓨鍒嗛厤鍜岄噴鏀懼嚱鏁幫紙濡俶alloc, new, new[], free,delete,delete[]絳夛級, 浠ュ強緇存姢涓涓叏灞鐨勫唴瀛樺垎閰峬ap鏁版嵁緇撴瀯瀹炵幇銆傞噸鍐欏悗鐨勫唴瀛樺垎閰嶆瘮濡俶y_malloc棣栧厛璋冪敤緋葷粺malloc鍔熻兘錛岀劧鍚庤褰曟瘡涓嬈alloc鎵ц榪囩▼涓殑鍐呭瓨鎿嶄綔淇℃伅錛堝寘鎷枃浠跺悕銆佽鍙蜂互鍙婂唴瀛樺昂瀵革紝鍑芥暟璋冪敤鏍堬級錛屼互鎸囬拡鍊間負 key鍊鹼紝瀛樿繘緇存姢鐨勫叏灞map琛ㄣ傝岄噸鍐欑殑my_free鍒欐槸鏍規嵁浼犲叆鐨勬寚閽堝煎湪 map 涓煡鎵劇浉搴旂殑鏁版嵁欏瑰茍灝嗕箣鍒犻櫎錛岃屽悗璋冪敤緋葷粺鐨刦ree 灝嗘寚閽堟墍鎸囧悜鐨勫唴瀛樺潡閲婃斁銆傝繖鏍峰綋紼嬪簭閫鍑虹殑鏃跺欙紝map 涓殑鍓╀綑鐨勬暟鎹」灝辨槸鎴戜滑鏈熸湜媯嫻嬬殑鍐呭瓨娉勬紡淇℃伅銆傛垜浠彲浠ヨ緭鍑烘硠婕忓唴瀛樺潡鐨勮緇嗘棩蹇楋紝姣斿鏂囦歡鍚嶏紝琛屽彿絳夌瓑銆傝繖灝嗗ぇ澶ф彁楂樼被浼糡ilera騫沖彴鐨勫唴瀛橀棶棰樿拷鏌ユ晥鐜囷紝鎻愰珮寮鍙戝拰嫻嬭瘯鐨勯熷害鍜岃川閲忋?/em>
2 鍩烘湰鍘熺悊錛?/span>
1)    閫氳繃閲嶅啓闈炲叡浜唴瀛樺垎閰嶉噴鏀懼嚱鏁癿alloc, new, new[]錛宖ree,delete,delete[]鎴幏 瀹冧滑鍦ㄦ墽琛岃繃紼嬩腑鐨勫唴瀛樻搷浣滀俊鎭傞噸杞藉艦寮忓涓嬶細
※   void* malloc( size_t nSize, char* pszFileName, int nLineNum )
※   void* new( size_t nSize, char* pszFileName, int nLineNum )
※   void* operator new[]( size_t nSize, char* pszFileName, int nLineNum )
※   void free( void *ptr )
※   void delete( void *ptr )
※   void operator delete[]( void *ptr )

2)    閫氳繃閲嶅啓鍏變韓鍐呭瓨鍒嗛厤閲婃斁鍑芥暟mspace_malloc錛宮space_free錛岄噸鍐欏艦寮忓涓嬶細

※   void* my_mspace_malloc( mspace msp,unsigned int Size, char* pszFileName, int nLineNum )
※   void my_mspace_free(mspace msp, void *ptr )

3)    鎴戜滑瀵筸alloc, new, new[]錛宮space_malloc榪涜浜嗛噸杞斤紝鍙傛暟鍖呮嫭size_t nSize銆佹枃浠跺悕鍜岃鍙鳳紝榪欓噷鐨勬枃浠跺悕鍜岃鍙峰氨鏄繖嬈alloc, new, new[]錛宮space_malloc鎿嶄綔絎﹁璋冪敤鏃舵墍鍦ㄧ殑鏂囦歡鍚嶅拰琛屽彿錛岃繖涓俊鎭皢鍦ㄥ彂鐜板唴瀛樻硠婕忔椂杈撳嚭錛屼互甯姪瀹氫綅娉勬紡鍏蜂綋浣嶇疆銆傚浜?free,delete,delete[]錛宮space_free鍙傛暟涓烘寚閽堝湴鍧銆?br />3 瀹炰緥錛?/span>
浠y_malloc, My_free涓轟緥錛岄噸鍐欏嚱鏁扮粨鏋勫涓嬶細
 
1.    鍦ㄩ噸鍐欑殑my_malloc鍑芥暟鐗堟湰涓紝鎴戜滑灝嗚皟鐢╩alloc 鐨勫師濮嬬増鏈茍灝嗙浉搴旂殑 size_t 鍙傛暟浼犲叆錛岀劧鍚庯紝鎴戜滑灝唌alloc鐨勫師濮嬬増鏈繑鍥炵殑鎸囬拡鍊間互鍙婅嬈″垎閰嶆墍鍦ㄧ殑鏂囦歡鍚嶅拰琛屽彿淇℃伅璁板綍涓嬫潵錛岃繖閲岄噰鐢⊿TL 鐨?map鏁版嵁緇撴瀯瀛樺偍錛屼互鎸囬拡鍊間負 key 鍊鹼紝鏂囦歡鍚嶏紝琛屽彿絳変俊鎭綔涓轟竴涓粨鏋勪綋鏄痸alue鍊箋?br />My_free閲嶅啓鍑芥暟緇撴瀯濡備笅錛?br />
 
2.    褰搈y_free 琚皟鐢ㄦ椂錛屾垜浠牴鎹紶鍏ョ殑鎸囬拡鍊煎湪 map 涓壘鍒扮浉搴旂殑鏁版嵁欏瑰茍灝嗕箣鍒犻櫎錛岃屽悗璋冪敤 free 灝嗘寚閽堟墍鎸囧悜鐨勫唴瀛樺潡閲婃斁銆傝繖鏍峰綋紼嬪簭閫鍑虹殑鏃跺欙紝map 涓殑鍓╀綑鐨勬暟鎹」灝辨槸鎴戜滑浼佸浘媯嫻嬬殑鍐呭瓨娉勬紡淇℃伅銆?br />4 瀹炵幇鍏抽敭鐐癸細
1)    濡備綍鍙栧緱鍐呭瓨鍒嗛厤浠g爜鎵鍦ㄧ殑鏂囦歡鍚嶅拰琛屽彿錛?/strong>
鍒╃敤 C 鐨勯緙栬瘧瀹?__FILE__ 鍜?__LINE__錛岃繖涓や釜瀹忓皢鍦ㄧ紪璇戞椂鍦ㄦ寚瀹氫綅緗睍寮涓鴻鏂囦歡鐨勬枃浠跺悕鍜岃琛岀殑琛屽彿
2)    鍒╃敤瀹忓畾涔夊紑鍏沖喅瀹氳蛋鏅氬垎鏀繕鏄唴瀛樻嫻嬪垎鏀紵
#if defined( MEM_DEBUG )
#define malloc DEBUG_MALLOC
#define free DEBUG_FREE
#endif
3)    浣曟椂鍒涘緩鐢ㄤ簬瀛樺偍鍐呭瓨鏁版嵁鐨?map 鏁版嵁緇撴瀯錛屽浣曠鐞嗭紝浣曟椂鎵撳嵃鍐呭瓨娉勬紡淇℃伅錛?/strong>
璁捐涓涓被鏉ュ皝瑁呰繖涓?map 浠ュ強瀵瑰畠鐨勬彃鍏ュ垹闄ゆ搷浣滐紝鐒跺悗鏋勯犺繖涓被鐨勪竴涓叏灞瀵硅薄錛坅ppMemory錛夛紝鍦ㄥ叏灞瀵硅薄錛坅ppMemory錛夌殑鏋勯犲嚱鏁頒腑鍒涘緩騫跺垵濮嬪寲榪欎釜鏁版嵁緇?鏋勶紝鑰屽湪鍏舵瀽鏋勫嚱鏁頒腑瀵規暟鎹粨鏋勪腑鍓╀綑鏁版嵁榪涜鍒嗘瀽鍜岃緭鍑恒俷ew 涓皢璋冪敤榪欎釜鍏ㄥ眬瀵硅薄鐨?insert 鎺ュ彛灝嗘寚閽堛佹枃浠跺悕銆佽鍙楓佸唴瀛樺潡澶у皬絳変俊鎭互鎸囬拡鍊間負 key 璁板綍鍒?map 涓紝鍦╠elete 涓皟鐢?erase 鎺ュ彛灝嗗搴旀寚閽堝肩殑 map 涓殑鏁版嵁欏瑰垹闄わ紝鍚屾椂瀵?map 鐨勮闂渶瑕佽繘琛屼簰鏂ュ悓姝ワ紝鍥犱負鍚屼竴鏃墮棿鍙兘浼氭湁澶氫釜榪涚▼榪涜鍫嗕笂鐨勫唴瀛樻搷浣溿?br />4)    濡備綍涓洪潪鍏變韓鍐呭瓨鐢寵map錛熷浣曚負鍏變韓鍐呭瓨鐢寵map錛?/strong>
闈炲叡浜唴瀛樼殑map,瀵逛簬澶氳繘紼嬪垯鏈夊涓猰ap錛屽彲鎸夛紙3錛夌殑鏂規硶澶勭悊銆傝屽浜庡叡浜唴瀛橈紝鍙兘A榪涚▼鐢寵鍒癇榪涚▼鎵嶉噴鏀撅紝浣嗘槸姣忎釜榪涚▼涓涓猰ap,鎴戜滑鍘繪壂鎻忚繖浜涙瘡涓猰ap鏃跺氨浼氬嚭鐜拌鎶ョ殑鐜拌薄錛屽洜姝ら渶瑕侀噰鍙栧皢map鏀懼叆鍏變韓鍐呭瓨鏂規硶錛氭垜浠敵璇蜂竴鍧楀叡浜唴瀛樺尯鍩熶負map,榪欎釜map瀵瑰悇榪涚▼鏄叡浜殑銆傚綋紼嬪簭涓悇榪涚▼璋冪敤鍏變韓鍐呭瓨鏃訛紝灝嗗悇榪涚▼鍒嗛厤鐨勬寚閽堝強鏂囦歡鍚嶈鍙風瓑璇︾粏淇℃伅瀛樿繘榪欏叡浜殑map銆傜▼搴忕粨鏉熸椂錛屾壂鎻忚鍏變韓鐨刴ap,灝辮兘寰楀埌鏈噴鏀劇殑淇℃伅銆傚皢 map鏀懼叆鍏變韓鍐呭瓨浣跨敤c++鏍囧噯搴撴椂闇瑕佹垜浠嚜宸卞疄鐜頒竴涓熀浜庡叡浜唴瀛樼殑allocator錛屾浛鎹ap榛樿鐨刟llocator錛屽湪榪欎釜allocator涓疄鐜癿ap鐨勫唴瀛樺垎閰嶆柟妗堛備篃鍙互浣跨敤boost搴擄紙1.35浠ヤ笂鐗堟湰錛夛紝瀹冨鍔犱簡涓涓彨鍋歜oost::interprocess鐨勫簱錛屽叿浣撳彲鍙傝僪ttp://blog.cong.co/stl-alloc.html
5)    濡備綍浣跨敤璇ュ伐鍏鳳紵
鍐呭瓨娉勯湶媯嫻嬫鏋舵彁渚涙帴鍙ibmemck.h錛屽唴瀹瑰涓?/p>


 鍦ㄨ嫻嬭瘯紼嬪簭閲屽寘鍚涓嬩唬鐮佸嵆鍙嬌鐢?br /> 
6)    浣曟椂濡備綍鎹曡幏淇″彿錛岀敓鎴恖eak鏂囦歡錛?/strong>
瀹氫箟涓涓叏灞鐨勭被寰楀璞★紝鍦ㄨ綾誨緱鏋勯犲嚱鏁伴噷閫氳繃signal鍑芥暟鎹曡幏SIGINT銆丼IGABRT銆丼IGFPE銆丼IGTERM淇″彿錛屽綋鎹曡幏鍒拌繖浜涗俊鍙峰叾涓箣涓鏃訛紝寮濮嬫壂鎻弇ap騫跺皢map鍓╀綑淇℃伅鍐欏叆leak鏂囦歡灞曠ず銆?br />7)    瀵逛復鐣岃祫婧愮殑鎺у埗錛?/strong>
鍏變韓鍐呭瓨鐨勫悇榪涚▼鍏變韓鐨刴ap錛屽悇榪涚▼闂磋繘琛岃鍐欐搷浣滈渶瑕佸姞閿侊紝鎴戜滑榪欓噷閲囩敤鐨勬槸淇″彿鐏疄鐜般?br />闈炲叡浜唴瀛樺悇涓繘紼嬪搴旂殑map錛屽湪鍚勮繘紼嬭繘琛屾彃鍏ュ垹闄ゆ搷浣滄椂涔熼渶瑕佸姞閿佸疄鐜?br />8)    紼嬪簭涓璵alloc浣滀負鍑芥暟鎸囬拡錛?/strong>
鐢變簬灝嗗師鍨媘alloc(size)閲嶅啓涓簃y_malloc(size錛宊_FILE__,__LINE__),榪欐牱鐢變簬鍑芥暟綾誨瀷涓嶄竴鑷達紝瀵艱嚧紼嬪簭璋冪敤璇ュ伐鍏鋒椂緙栬瘧鏃犳硶閫氳繃錛岀湡瀵硅繖縐嶆儏鍐電殑瑙e喅鍔炴硶涓猴細閲嶅啓malloc(size)涓簃y_malloc_p(size)榪欐牱闄や簡鏂囦歡鍚嶅拰琛屽彿鏃犳硶寰楃煡澶栵紝娉勯湶鐨勫灝戝唴瀛樺彲浠ユ姤鍑恒?br />
杞嚜http://hi.baidu.com/baiduqa/blog/item/e4c991c5ef46e5c7d10060fb.html



]]>
<杞?gt;boost::any鐨勭敤娉曘佷紭鐐瑰拰緙虹偣浠ュ強婧愪唬鐮佸垎鏋?http://m.shnenglu.com/guojingjia2006/archive/2011/06/16/148802.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Thu, 16 Jun 2011 10:32:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2011/06/16/148802.htmlhttp://m.shnenglu.com/guojingjia2006/comments/148802.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2011/06/16/148802.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/148802.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/148802.html
01.#include <iostream>  
02.#include <list>  
03.#include <boost/any.hpp>  
04. 
05.typedef std::list<boost::any> list_any;  
06. 
07.//鍏抽敭閮ㄥ垎錛氬彲浠ュ瓨鏀句換鎰忕被鍨嬬殑瀵硅薄  
08.void fill_list(list_any& la)  
09.{      
10.    la.push_back(10);//瀛樻斁甯告暟   
11.    la.push_back( std::string("dyunze") );//瀛樻斁瀛楃涓插璞★紱娉ㄦ剰la.push_back(“dyunze”)閿欒錛屽洜涓轟細琚綋閿欏瓧絎︿覆鏁扮粍  
12.}  
13. 
14.//鏍規嵁綾誨瀷榪涜鏄劇ず  
15.void show_list(list_any& la)  
16.{  
17.    list_any::iterator it;  
18.    boost::any anyone;  
19. 
20.    for( it = la.begin(); it != la.end(); it++ )  
21.    {     
22.        anyone = *it;  
23. 
24.        if( anyone.type() == typeid(int) )  
25.            std::cout<<boost::any_cast<int>(*it)<<std::endl;  
26.        else if( anyone.type() == typeid(std::string) )  
27.            std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;  
28.    }  
29.}  
30. 
31.int main()  
32.{  
33.    list_any la;  
34.    fill_list(la);  
35.    show_list(la);  
36. 
37.    return 0;  
38.} 
#include <iostream>
#include <list>
#include <boost/any.hpp>

typedef std::list<boost::any> list_any;

//鍏抽敭閮ㄥ垎錛氬彲浠ュ瓨鏀句換鎰忕被鍨嬬殑瀵硅薄
void fill_list(list_any& la)
{   
    la.push_back(10);//瀛樻斁甯告暟
    la.push_back( std::string("dyunze") );//瀛樻斁瀛楃涓插璞★紱娉ㄦ剰la.push_back(“dyunze”)閿欒錛屽洜涓轟細琚綋閿欏瓧絎︿覆鏁扮粍
}

//鏍規嵁綾誨瀷榪涜鏄劇ず
void show_list(list_any& la)
{
    list_any::iterator it;
    boost::any anyone;

    for( it = la.begin(); it != la.end(); it++ )
    {   
        anyone = *it;

        if( anyone.type() == typeid(int) )
            std::cout<<boost::any_cast<int>(*it)<<std::endl;
        else if( anyone.type() == typeid(std::string) )
            std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;
    }
}

int main()
{
    list_any la;
    fill_list(la);
    show_list(la);

    return 0;
}

boost::any鐨勪紭鐐癸細

     瀵硅璁℃ā寮忕悊瑙g殑鏈嬪弸閮戒細鐭ラ亾鍚堟垚妯″紡銆傚洜涓哄鎬佸彧鏈夊湪浣跨敤鎸囬拡鎴栧紩鐢ㄧ殑鎯呭喌涓嬫墠鑳芥樉鐜幫紝鎵浠td瀹瑰櫒涓彧鑳藉瓨鏀炬寚閽堟垨寮曠敤錛堜絾瀹為檯涓婂彧鑳藉瓨鏀炬寚閽堬紝鏃犳硶瀛樻斁寮曠敤錛岃繖涓ソ鍍忔槸c++鐨勪笉瓚沖惂錛夈傚錛?br />
     std::list<BaseClass*> mylist;

榪欐牱錛屾垜浠氨瑕佸鎸囬拡鎵鎸囧悜鍐呭鐨勭敓瀛樺懆鏈熸搷蹇?鍙兘闇瑕佺▼搴忓憳閫傛椂鍒犻櫎鐢寵鐨勫唴瀛橈紱浣嗘槸鐢變簬瀛樻斁鎸囬拡錛屾彃鍏?鍒犻櫎鐨勬晥鐜囬珮)錛岃屼嬌鐢╞oost::any灝卞彲鑳介伩鍏嶈繖縐嶆儏鍐碉紝鍥犱負鎴戜滑鍙互瀛樻斁綾誨瀷鏈韓錛堝綋鐒跺瓨鏀炬寚閽堜篃鍙互錛夈傝繖鏄痓oost::any鐨勪紭鐐逛箣涓銆?br />
    boost::any鍙︿竴涓紭鐐規槸鍙互瀛樻斁浠諱綍綾誨瀷銆傝屽墠闈㈡彁鍒扮殑mylist鍙兘瀛樻斁BaseClass綾繪寚閽堜互鍙婂叾緇ф壙綾葷殑鎸囬拡銆?br />
boost::any鐨勭己鐐癸細

    鐢變簬boost::any鍙互瀛樻斁浠諱綍綾誨瀷錛岃嚜鐒跺畠鐢ㄤ笉浜嗗鎬佺壒鎬э紝娌℃湁緇熶竴鐨勬帴鍙o紝鎵浠ュ湪鑾峰彇瀹瑰櫒涓殑鍏冪礌鏃墮渶瑕佸疄鐜板垽鍒厓绱犵殑鐪熸綾誨瀷錛岃繖澧炲姞浜嗙▼搴忓憳鐨勮礋鎷呫備笌闈㈠悜瀵硅薄緙栫▼鎬濇兂鏈変簺鐭涚浘錛屼絾鏁翠釜鏍囧噯c++妯℃澘搴撲綍灝濅笉鏄姝わ紝鐢ㄩ偅浜涚墰浜虹殑璇濇潵璇達紝鏄?#8220;鏈夌泭琛ュ厖”銆?br />
   鎬諱箣錛屾湁鍒╁繀鏈夊紛錛屾病鏈夊崄鍏ㄥ崄緹庣殑銆?br />
  

鍒嗘瀽騫舵ā浠縝oost::any錛?br />
     璇諱簡涓涓媌oost::any鐨勬簮浠g爜錛屽茍妯′豢涓涓嬪叾瀹炵幇(鐩稿綋涓閮ㄥ垎鏃舵嫹璐濆師浠g爜)錛屼笅闈㈡槸浠g爜(鍙寘鍚繀瑕佸姛鑳?銆?br />
瀹炵幇any鐨勫姛鑳戒富瑕佺敱涓夐儴鍒嗙粍鎴愶細
1錛塧ny綾?br />2錛夌湡姝d繚瀛樻暟鎹殑holder綾誨強鍏跺熀綾籶laceholder
3錛夎幏鍙栫湡姝f暟鎹殑妯℃澘鍑芥暟any_cast錛岀被鍨嬭漿鎹㈢殑鍔熻兘銆?br />
view plaincopy to clipboardprint?
01.#include <iostream>  
02.#include <list>  
03.#include <cassert>  
04. 
05.//鑷畾涔夌殑any綾?nbsp; 
06.class any  
07.{  
08.public:  
09.      
10.    //淇濆瓨鐪熸鏁版嵁鐨勬帴鍙g被  
11.    class placeholder  
12.    {  
13.    public:       
14.        virtual ~placeholder()  
15.        {  
16.        }  
17.    public:   
18. 
19.        virtual const std::type_info & type() const = 0;  
20.        virtual placeholder * clone() const = 0;      
21.    };  
22. 
23.    //鐪熸淇濆瓨鍜岃幏鍙栨暟鎹殑綾匯?nbsp; 
24.    template<typename ValueType>  
25.    class holder : public placeholder  
26.    {  
27.    public:           
28.        holder(const ValueType & value): held(value)  
29.        {  
30.        }  
31. 
32.    public:   
33. 
34.        virtual const std::type_info & type() const 
35.        {  
36.            return typeid(ValueType);  
37.        }  
38. 
39.        virtual placeholder * clone() const 
40.        {  
41.            return new holder(held);//浣跨敤浜嗗師鍨嬫ā寮?nbsp; 
42.        }  
43. 
44.    public:   
45. 
46.        //鐪熸鐨勬暟鎹紝灝變繚瀛樺湪榪欓噷  
47.        ValueType held;  
48.    };  
49. 
50.public:  
51. 
52.    any(): content(NULL)     
53.    {         
54.    }  
55. 
56.    //妯℃澘鏋勯犲嚱鏁幫紝鍙傛暟鍙互鏄換鎰忕被鍨嬶紝鐪熸鐨勬暟鎹繚瀛樺湪content涓?nbsp; 
57.    template<typename ValueType>  
58.    any(const ValueType & value): content(new holder<ValueType>(value))  
59.    {  
60.    }    
61. 
62.    //鎷瘋礉鏋勯犲嚱鏁?nbsp; 
63.    any(const any & other)  
64.        : content(other.content ? other.content->clone() : 0)  
65.    {  
66.    }  
67. 
68.    //鏋愭瀯鍑芥暟錛屽垹闄や繚瀛樻暟鎹殑content瀵硅薄  
69.    ~any()  
70.    {  
71.        if(NULL != content)  
72.            delete content;  
73.    }  
74. 
75.private:  
76.    //涓涓猵laceholde瀵硅薄鎸囬拡錛屾寚鍚戝叾瀛愮被folder鐨勪竴涓疄鐜?nbsp; 
77.    // 鍗砪ontent( new holder<ValueType>(value) )璇彞  
78.    placeholder* content;  
79. 
80.    template<typename ValueType> friend ValueType any_cast(const any& operand);  
81.public:   
82. 
83.    //鏌ヨ鐪熷疄鏁版嵁鐨勭被鍨嬨?nbsp; 
84.    const std::type_info & type() const 
85.    {  
86.        return content ? content->type() : typeid(void);  
87.    }  
88.};  
89. 
90. 
91.//鑾峰彇content->helder鏁版嵁鐨勬柟娉曘傜敤鏉ヨ幏鍙栫湡姝g殑鏁版嵁  
92.template<typename ValueType>  
93.ValueType any_cast(const any& operand)  
94.{  
95.    assert( operand.type() == typeid(ValueType) );  
96.    return static_cast<any::holder<ValueType> *>(operand.content)->held;  
97.}  
98. 
99.//涓嬩唬鐮佹槸浣跨敤紺轟緥  
100. 
101.typedef std::list<any> list_any;  
102. 
103.void fill_list(list_any& la)  
104.{      
105.    la.push_back(10);//瀛樻斁甯告暟錛涜皟鐢ㄤ簡any鐨勬ā鏉挎瀯閫犲嚱鏁幫紝涓嬪悓  
106.    la.push_back( std::string("鎴戞槸string") );//瀛樻斁瀛楃涓插璞★紱娉ㄦ剰la.push_back(“dyunze”)閿欒錛屽洜涓轟細琚綋閿欏瓧絎︿覆鏁扮粍  
107. 
108.    char* p = "鎴戞槸甯擱噺鍖哄瓧絎︿覆abc";  
109.    la.push_back(p);//鍙互瀛樻斁鎸囬拡錛屼絾瑕佹敞鎰忔寚閽堢殑澶辨晥闂  
110.}  
111. 
112.//鏍規嵁綾誨瀷榪涜鏄劇ず  
113.void show_list(list_any& la)  
114.{  
115.    list_any::iterator it;  
116. 
117.    for( it = la.begin(); it != la.end(); it++ )  
118.    {     
119. 
120.        if( (*it).type() == typeid(int) )  
121.            std::cout<<any_cast<int>(*it)<<std::endl;  
122.        else if( (*it).type() == typeid(std::string) )  
123.            std::cout<<any_cast<std::string>(*it).c_str()<<std::endl;  
124.        else if( (*it).type() == typeid(char*) )  
125.            std::cout<<any_cast<char*>(*it)<<std::endl;  
126.    }  
127.}  
128. 
129.int main()  
130.{  
131.    list_any la;  
132.    fill_list(la);  
133.    show_list(la);  
134. 
135.    return 0;  
136.} 

 boost::any鏄竴涓緢鏈夎叮鐨勭被錛屽垰鍒氬紑濮嬫垜榪樹互涓哄叾灝辨槸涓涓獀ariant綾誨瀷錛?br />鑳藉灝嗕換鎰忕被鍨嬪間繚瀛樿繘鍘伙紝鑳藉浠ヤ換鎰忕被鍨嬪艱鍑烘潵錛屼笉榪囨垜閿欎簡 :(
  boost::any鐨勪綔鑰呰涓猴紝鎵璋揼eneric type鏈変笁涓眰闈㈢殑瑙i噴鏂規硶錛?br />  1.綾諱技variant綾誨瀷閭f牱浠繪剰榪涜綾誨瀷杞崲錛屽彲浠ヤ繚瀛樹竴涓?int)5榪涘幓錛?br />    璇諱竴涓?string)"5"鍑烘潵銆俉in涓嬮潰鐨刅ARIANT綾誨瀷鏄互涓涓法澶х殑
    union瀹炵幇鐨勭被浼煎姛鑳斤紝浣跨敤鐏墊椿浣嗘晥鐜囪緝浣?br />  2.鍖哄埆瀵瑰緟鍖呭惈鍊肩殑綾誨瀷錛屼繚瀛樹竴涓?int)5榪涘幓錛屼笉浼氳闅愬紡杞崲涓?br />    (string)'5'鎴栬?double)5.0錛岃繖鏍鋒晥鐜囪緝楂樹笖綾誨瀷瀹夊叏錛?br />    涓嶅繀鎷呭績ambiguous conversions
  3.瀵瑰寘鍚肩被鍨嬩笉鍔犲尯鍒紝渚嬪鎶婃墍鏈変繚瀛樼殑鍊煎己鍒惰漿鎹負void *淇濆瓨
    璇誨彇鏃跺啀鏈夌▼搴忓憳鍒ゆ柇鍏剁被鍨嬨傝繖鏍鋒晥鐜囪櫧鏈楂樹絾鏃犳硶淇濊瘉綾誨瀷瀹夊叏
  boost::any灝遍夋嫨浜嗙浜屽眰闈㈢殑璁捐鎬濊礬錛屽畠鍏佽鐢ㄦ埛灝嗕換鎰忕被鍨嬪間繚瀛?br />榪涗竴涓猘ny綾誨瀷鍙橀噺錛屼絾鍐呴儴騫朵笉鏀瑰彉鍊肩殑綾誨瀷錛屽茍鎻愪緵鏂規硶璁╃敤鎴峰湪浣跨敤鏃?br />涓誨姩/琚姩榪涜綾誨瀷鍒ゆ柇銆?br />
  鍦ㄥ疄鐜版柟闈紝boost::any浣跨敤涓ゅ眰鍐呴儴綾籶laceholder鍜宧older淇濆瓨
瀹為檯綾誨瀷鐨勫箋傜被placeholder鍙槸涓涓帴鍙o紝妯℃澘綾籬older鏄壒瀹氱被鍨?br />鐨勫疄鐜般傚叾涓璽ype()鏂規硶鑾峰彇瀹為檯鍊肩被鍨嬶紝鍗硉ypeid(ValueType);
clone()鏂規硶鑾峰彇鍊肩殑鎷瘋礉return new holder(held);
  virtual const std::type_info & type() const
  virtual placeholder * clone() const
  鍏跺肩殑綾誨瀷淇℃伅涓嶈薄Win鐨刅ARIANT閭f牱浠ヤ笓闂ㄧ殑瀛楁淇濆瓨錛?br />鑰屾槸閫氳繃妯℃澘鍙傛暟褰㈠紡闈欐佷繚瀛樸傝繖鏍鋒晥鐜囨洿楂橈紙浠呭湪緙栬瘧鏈燂級錛?br />
閫氱敤鎬ф洿寮猴紙浠諱綍綾誨瀷閮藉彲浠ワ紝鐪熸any錛変絾鐏墊椿鎬т笉濡俈ARIANT
  鍦ㄨ繘琛屾嫹璐濇瀯閫?璧嬪?swap鏃訛紝閮界洿鎺ュ皢鏁翠釜placeholder鎹㈡帀錛?br />榪欐牱鍙互淇濊瘉鍊肩被鍨嬬殑寤剁畫鎬с?br />
  鍦ㄤ嬌鐢ㄦ柟闈紝鎻愪緵浜嗕富鍔?琚姩榪涜綾誨瀷媯嫻嬬殑鏂規硶銆?br />  鍙互浣跨敤any::type()鏂規硶涓誨姩媯嫻嬪肩被鍨?br />bool is_int(const boost::any & operand)
{
    return operand.type() == typeid(int);
}
  涔熷彲浠ラ氳繃any_cast鍑芥暟琚姩榪涜媯嫻嬨傛鍑芥暟涓嶤++涓殑*_cast
緋誨垪鍏抽敭瀛楁湁鐩稿悓鐨勮娉曡鑼冿紝灝濊瘯榪涜綾誨瀷杞崲錛屽綾誨瀷涓嶅尮閰嶅垯瀵?br />鎸囬拡杞崲榪斿洖NULL錛屽寮曠敤杞崲鎶涘嚭boost::bad_any_cast寮傚父
  boost::any str = string("12345");
  try
  {
    cout << boost::any_cast<int>(str) << endl;
  }
  catch(boost::bad_any_cast e)
  {
    cerr << e.what() << endl;
  }


  鍦ㄥ簲鐢ㄦ柟闈紝any綾誨瀷閫傚悎浜庣被鍨嬩笉鍚屼絾浣跨敤鐩稿叧鐨勫箋傚C++鐨?..
褰㈠紡鐨勫嚱鏁板弬鏁版湰浜嬩笉鏄被鍨嬪畨鍏ㄧ殑錛屽彲浠ラ氳繃vector<any>鏀歸犱箣
鐒跺悗鍦ㄤ嬌鐢ㄦ椂媯嫻嬬被鍨嬫槸鍚﹀尮閰嶏紝濡傚彲鏀歸爌rintf涓?br />  void safe_printf(const char *format, const vector<any>& params)
  {
    int index = 0;
    for(const char *pch = format; *pch; pch++)
    {
      switch(*pch)
      {
        case '%':
        {
          switch(*++pch)
          {
            case 'i':
            case 'd':
            {
              if(params[index].type() == typeid(int) ||
                 params[index].type() == typeid(short))
              {
                ...
              }
              else
                throw ...
            }
          }
        }
        case '\':
        {
          ...
        }
        default:
        {
          putchar(*pch);
        }
      }
    }
  }

闄勶細boost::any.hpp
#ifndef BOOST_ANY_INCLUDED
#define BOOST_ANY_INCLUDED

// what:  variant type boost::any
// who:   contributed by Kevlin Henney,
//        with features contributed and bugs found by
//        Ed Brey, Mark Rodgers, Peter Dimov, and James Curran
// when:  July 2001
// where: tested with BCC 5.5, MSVC 6.0, and g++ 2.95

#include <algorithm>
#include <typeinfo>

#include "boost/config.hpp"

namespace boost
{
    class any
    {
    public: // structors

        any()
          : content(0)
        {
        }

        template<typename ValueType>
        any(const ValueType & value)
          : content(new holder<ValueType>(value))
        {
        }

        any(const any & other)
          : content(other.content ? other.content->clone() : 0)
        {
        }

        ~any()
        {
            delete content;
        }

    public: // modifiers

        any & swap(any & rhs)
        {
            std::swap(content, rhs.content);
            return *this;
        }

        template<typename ValueType>
        any & operator=(const ValueType & rhs)
        {
            any(rhs).swap(*this);
            return *this;
        }

        any & operator=(const any & rhs)
        {
            any(rhs).swap(*this);
            return *this;
        }

    public: // queries

        bool empty() const
        {
            return !content;
        }

        const std::type_info & type() const
        {
            return content ? content->type() : typeid(void);
        }

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
    private: // types
#else
    public: // types (public so any_cast can be non-friend)
#endif


        class placeholder
        {
        public: // structors
    
            virtual ~placeholder()
            {
            }

        public: // queries

            virtual const std::type_info & type() const = 0;

            virtual placeholder * clone() const = 0;
    
        };

        template<typename ValueType>
        class holder : public placeholder
        {
        public: // structors

            holder(const ValueType & value)
              : held(value)
            {
            }

        public: // queries

            virtual const std::type_info & type() const
            {
                return typeid(ValueType);
            }

            virtual placeholder * clone() const
            {

                return new holder(held);
            }

        public: // representation

            ValueType held;

        };

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS

    private: // representation

        template<typename ValueType>
        friend ValueType * any_cast(any *);

#else

    public: // representation (public so any_cast can be non-friend)

#endif

        placeholder * content;

    };

    class bad_any_cast : public std::bad_cast
    {
    public:
        virtual const char * what() const throw()
        {
            return "boost::bad_any_cast: "
                   "failed conversion using boost::any_cast";
        }
    };

    template<typename ValueType>
    ValueType * any_cast(any * operand)
    {
        return operand && operand->type() == typeid(ValueType)
                    ? &static_cast<any::holder<ValueType> *>(operand->content)->held
                    : 0;
    }

    template<typename ValueType>
    const ValueType * any_cast(const any * operand)
    {
        return any_cast<ValueType>(const_cast<any *>(operand));
    }

    template<typename ValueType>
    ValueType any_cast(const any & operand)
    {
        const ValueType * result = any_cast<ValueType>(&operand);
        if(!result)
            throw bad_any_cast();
        return *result;
    }

}

// Copyright Kevlin Henney, 2000, 2001, 2002. All rights reserved.
//
// Permission to use, copy, modify, and distribute this software for any
// purpose is hereby granted without fee, provided that this copyright and
// permissions notice appear in all copies and derivatives.
//
// This software is provided "as is" without express or implied warranty.

#endif



]]>c++ 鍐呭瓨姹?/title><link>http://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143473.html</link><dc:creator>灝忔灉瀛?/dc:creator><author>灝忔灉瀛?/author><pubDate>Tue, 05 Apr 2011 12:18:00 GMT</pubDate><guid>http://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143473.html</guid><wfw:comment>http://m.shnenglu.com/guojingjia2006/comments/143473.html</wfw:comment><comments>http://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/guojingjia2006/comments/commentRss/143473.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/guojingjia2006/services/trackbacks/143473.html</trackback:ping><description><![CDATA[<p><a name=N100A5><span id="hvzpftn" class=atitle>寮曡█</span></a></p> <p>鏈功涓昏閽堝鐨勬槸 C++ 紼嬪簭鐨勬ц兘浼樺寲錛屾繁鍏ヤ粙緇?C++ 紼嬪簭鎬ц兘浼樺寲鐨勬柟娉曞拰瀹炰緥銆傚叏涔︾敱 4 涓瘒緇勬垚錛岀 1 綃囦粙緇?C++ 璇█鐨勫璞℃ā鍨嬶紝璇ョ瘒鏄紭鍖?C++ 紼嬪簭鐨勫熀紜錛涚 2 綃囦富瑕侀拡瀵瑰浣曚紭鍖?C++ 紼嬪簭鐨勫唴瀛樹嬌鐢紱絎?3 綃囦粙緇嶅浣曚紭鍖栫▼搴忕殑鍚姩鎬ц兘錛涚 4 綃囦粙緇嶄簡涓夌被鎬ц兘浼樺寲宸ュ叿錛屽嵆鍐呭瓨鍒嗘瀽宸ュ叿銆佹ц兘鍒嗘瀽宸ュ叿鍜?I/O 媯嫻嬪伐鍏鳳紝瀹冧滑鏄祴閲忕▼搴忔ц兘鐨勫埄鍣ㄣ?/p> <p>鏈珷棣栧厛綆鍗曚粙緇嶈嚜瀹氫箟鍐呭瓨姹犳ц兘浼樺寲鐨勫師鐞嗭紝鐒跺悗鍒椾婦杞歡寮鍙戜腑甯哥敤鐨勫唴瀛樻睜鐨勪笉鍚岀被鍨嬶紝騫剁粰鍑哄叿浣撳疄鐜扮殑瀹炰緥銆?/p> <div id="hvzpftn" class=ibm-alternate-rule></div> <p class="ibm-ind-link ibm-back-to-top"><a class=ibm-anchor-up-link ><u><font color=#0066cc>鍥為〉棣?/font></u></a></p> <p><a name=N100B1><span id="hvzpftn" class=atitle>6.1 鑷畾涔夊唴瀛樻睜鎬ц兘浼樺寲鐨勫師鐞?/span></a></p> <div id="hvzpftn" class="ibm-container dw-container-sidebar ibm-alternate-two"> <div id="hvzpftn" class=ibm-container-body> <p> </p> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td vAlign=top><img border=0 alt=鍥句功淇℃伅 src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/cpppface.jpg" width=100 height=127> </td> <td vAlign=top><img border=0 alt="" src="http://www.ibm.com/i/c.gif" width=10> </td> <td><strong>涔﹀悕錛?/strong>銆奀++搴旂敤紼嬪簭鎬ц兘浼樺寲銆?<br><strong>浣滆咃細</strong>鍐畯鍗庛佸緪鑾廣佺▼榪溿佹豹紓?絳夌紪钁?<br><strong>鍑虹増紺撅細</strong>鐢靛瓙宸ヤ笟鍑虹増紺?<br><strong>鍑虹増鏃ユ湡錛?/strong>2007 騫?03 鏈?<br><strong>ISBN錛?/strong>978-7-121-03831-0 <br><strong>璐拱錛?/strong> <a ><u><font color=#0066cc>涓浗浜掑姩鍑虹増緗?/font></u></a>銆?a ><u><font color=#0066cc>dearbook</font></u></a> </td> </tr> <tr> <td colSpan=3> <p><strong>鎺ㄨ崘绔犺妭:</strong> </p> <ul> <li><a ><u><font color=#0066cc>鍓嶈█</font></u></a> 鍜?<a ><u><font color=#0066cc>鐩綍</font></u></a> </li> <li><a ><u><font color=#0066cc>絎?2 绔狅細C++ 璇█鐗規х殑鎬ц兘鍒嗘瀽</font></u></a> </li> <li><a ><u><font color=#0066cc>絎?6 绔狅細鍐呭瓨姹?/font></u></a> </li> </ul> <p> </p> <p>鏇村鎺ㄨ崘涔︾睄錛岃璁塊棶 <a ><u><font color=#0066cc>developerWorks 鍥句功棰戦亾</font></u></a>銆?/p> <p>嬈㈣繋鎮ㄥ鏈功鎻愬嚭瀹濊吹鐨勫弽棣堟剰瑙併傛偍鍙互閫氳繃鏈〉闈㈡渶涓嬫柟鐨?<a ><u><font color=#0066cc>寤鴻</font></u></a> 鏍忕洰涓烘湰鏂囨墦鍒嗭紝騫跺弽棣堟偍鐨勫緩璁拰鎰忚銆?/p> <p>濡傛灉鎮ㄥ developerWorks 鍥句功棰戦亾鏈変粈涔堝ソ鐨勫緩璁紝<a ><u><font color=#0066cc>嬈㈣繋鎮ㄥ皢寤鴻鍙戠粰鎴戜滑</font></u></a>銆?/p> </td> </tr> </tbody> </table> <p> </p> </div> </div> <p>濡傚墠鎵榪幫紝璇昏呭凡緇忎簡瑙e埌"鍫?鍜?鏍?鐨勫尯鍒傝屽湪緙栫▼瀹炶返涓紝涓嶅彲閬垮厤鍦拌澶ч噺鐢ㄥ埌鍫嗕笂鐨勫唴瀛樸備緥濡傚湪紼嬪簭涓淮鎶や竴涓摼琛ㄧ殑鏁版嵁緇撴瀯鏃訛紝姣忔鏂板鎴栬呭垹闄や竴涓摼琛ㄧ殑鑺傜偣錛岄兘闇瑕佷粠鍐呭瓨鍫嗕笂鍒嗛厤鎴栬呴噴鏀句竴瀹氱殑鍐呭瓨錛涘湪緇存姢涓涓姩鎬佹暟緇勬椂錛屽鏋滃姩鎬佹暟緇勭殑澶у皬涓嶈兘婊¤凍紼嬪簭闇瑕佹椂錛屼篃瑕佸湪鍐呭瓨鍫嗕笂鍒嗛厤鏂扮殑鍐呭瓨絀洪棿銆?/p> <p><a name=N10145><span id="hvzpftn" class=smalltitle>6.1.1 榛樿鍐呭瓨綆$悊鍑芥暟鐨勪笉瓚?/span></a></p> <p>鍒╃敤榛樿鐨勫唴瀛樼鐞嗗嚱鏁皀ew/delete鎴杕alloc/free鍦ㄥ爢涓婂垎閰嶅拰閲婃斁鍐呭瓨浼氭湁涓浜涢澶栫殑寮閿銆?/p> <p>緋葷粺鍦ㄦ帴鏀跺埌鍒嗛厤涓瀹氬ぇ灝忓唴瀛樼殑璇鋒眰鏃訛紝棣栧厛鏌ユ壘鍐呴儴緇存姢鐨勫唴瀛樼┖闂插潡琛紝騫朵笖闇瑕佹牴鎹竴瀹氱殑綆楁硶錛堜緥濡傚垎閰嶆渶鍏堟壘鍒扮殑涓嶅皬浜庣敵璇峰ぇ灝忕殑鍐呭瓨鍧楃粰璇鋒眰鑰咃紝鎴栬呭垎閰嶆渶閫備簬鐢寵澶у皬鐨勫唴瀛樺潡錛屾垨鑰呭垎閰嶆渶澶х┖闂茬殑鍐呭瓨鍧楃瓑錛夋壘鍒板悎閫傚ぇ灝忕殑絀洪棽鍐呭瓨鍧椼傚鏋滆絀洪棽鍐呭瓨鍧楄繃澶э紝榪橀渶瑕佸垏鍓叉垚宸插垎閰嶇殑閮ㄥ垎鍜岃緝灝忕殑絀洪棽鍧椼傜劧鍚庣郴緇熸洿鏂板唴瀛樼┖闂插潡琛紝瀹屾垚涓嬈″唴瀛樺垎閰嶃傜被浼煎湴錛屽湪閲婃斁鍐呭瓨鏃訛紝緋葷粺鎶婇噴鏀劇殑鍐呭瓨鍧楅噸鏂板姞鍏ュ埌絀洪棽鍐呭瓨鍧楄〃涓傚鏋滄湁鍙兘鐨勮瘽錛屽彲浠ユ妸鐩擱偦鐨勭┖闂插潡鍚堝茍鎴愯緝澶х殑絀洪棽鍧椼?/p> <p>榛樿鐨勫唴瀛樼鐞嗗嚱鏁拌繕鑰冭檻鍒板綰跨▼鐨勫簲鐢紝闇瑕佸湪姣忔鍒嗛厤鍜岄噴鏀懼唴瀛樻椂鍔犻攣錛屽悓鏍峰鍔犱簡寮閿銆?/p> <p>鍙錛屽鏋滃簲鐢ㄧ▼搴忛綣佸湴鍦ㄥ爢涓婂垎閰嶅拰閲婃斁鍐呭瓨錛屽垯浼氬鑷存ц兘鐨勬崯澶便傚茍涓斾細浣跨郴緇熶腑鍑虹幇澶ч噺鐨勫唴瀛樼鐗囷紝闄嶄綆鍐呭瓨鐨勫埄鐢ㄧ巼銆?/p> <p>榛樿鐨勫垎閰嶅拰閲婃斁鍐呭瓨綆楁硶鑷劧涔熻冭檻浜嗘ц兘錛岀劧鑰岃繖浜涘唴瀛樼鐞嗙畻娉曠殑閫氱敤鐗堟湰涓轟簡搴斾粯鏇村鏉傘佹洿騫挎硾鐨勬儏鍐碉紝闇瑕佸仛鏇村鐨勯澶栧伐浣溿傝屽浜庢煇涓涓叿浣撶殑搴旂敤紼嬪簭鏉ヨ錛岄傚悎鑷韓鐗瑰畾鐨勫唴瀛樺垎閰嶉噴鏀炬ā寮忕殑鑷畾涔夊唴瀛樻睜鍒欏彲浠ヨ幏寰楁洿濂界殑鎬ц兘銆?/p> <p><a name=N1015A><span id="hvzpftn" class=smalltitle>6.1.2 鍐呭瓨姹犵殑瀹氫箟鍜屽垎綾?/span></a></p> <p>鑷畾涔夊唴瀛樻睜鐨勬濇兂閫氳繃榪欎釜"姹?瀛楄〃闇叉棤鐤戯紝搴旂敤紼嬪簭鍙互閫氳繃緋葷粺鐨勫唴瀛樺垎閰嶈皟鐢ㄩ鍏堜竴嬈℃х敵璇烽傚綋澶у皬鐨勫唴瀛樹綔涓轟竴涓唴瀛樻睜錛屼箣鍚庡簲鐢ㄧ▼搴忚嚜宸卞鍐呭瓨鐨勫垎閰嶅拰閲婃斁鍒欏彲浠ラ氳繃榪欎釜鍐呭瓨姹犳潵瀹屾垚銆傚彧鏈夊綋鍐呭瓨姹犲ぇ灝忛渶瑕佸姩鎬佹墿灞曟椂錛屾墠闇瑕佸啀璋冪敤緋葷粺鐨勫唴瀛樺垎閰嶅嚱鏁幫紝鍏朵粬鏃墮棿瀵瑰唴瀛樼殑涓鍒囨搷浣滈兘鍦ㄥ簲鐢ㄧ▼搴忕殑鎺屾帶涔嬩腑銆?/p> <p>搴旂敤紼嬪簭鑷畾涔夌殑鍐呭瓨姹犳牴鎹笉鍚岀殑閫傜敤鍦烘櫙鍙堟湁涓嶅悓鐨勭被鍨嬨?/p> <p>浠庣嚎紼嬪畨鍏ㄧ殑瑙掑害鏉ュ垎錛屽唴瀛樻睜鍙互鍒嗕負鍗曠嚎紼嬪唴瀛樻睜鍜屽綰跨▼鍐呭瓨姹犮傚崟綰跨▼鍐呭瓨姹犳暣涓敓鍛藉懆鏈熷彧琚竴涓嚎紼嬩嬌鐢紝鍥犺屼笉闇瑕佽冭檻浜掓枼璁塊棶鐨勯棶棰橈紱澶氱嚎紼嬪唴瀛樻睜鏈夊彲鑳借澶氫釜綰跨▼鍏變韓錛屽洜姝ゅ垯闇瑕佸湪姣忔鍒嗛厤鍜岄噴鏀懼唴瀛樻椂鍔犻攣銆傜浉瀵硅岃█錛屽崟綰跨▼鍐呭瓨姹犳ц兘鏇撮珮錛岃屽綰跨▼鍐呭瓨姹犻傜敤鑼冨洿鏇村箍銆?/p> <p>浠庡唴瀛樻睜鍙垎閰嶅唴瀛樺崟鍏冨ぇ灝忔潵鍒嗭紝鍙互鍒嗕負鍥哄畾鍐呭瓨姹犲拰鍙彉鍐呭瓨姹犮傛墍璋撳浐瀹氬唴瀛樻睜鏄寚搴旂敤紼嬪簭姣忔浠庡唴瀛樻睜涓垎閰嶅嚭鏉ョ殑鍐呭瓨鍗曞厓澶у皬浜嬪厛宸茬粡紜畾錛屾槸鍥哄畾涓嶅彉鐨勶紱鑰屽彲鍙樺唴瀛樻睜鍒欐瘡嬈″垎閰嶇殑鍐呭瓨鍗曞厓澶у皬鍙互鎸夐渶鍙樺寲錛屽簲鐢ㄨ寖鍥存洿騫匡紝鑰屾ц兘姣斿浐瀹氬唴瀛樻睜瑕佷綆銆?/p> <p><a name=N1016C><span id="hvzpftn" class=smalltitle>6.1.3 鍐呭瓨姹犲伐浣滃師鐞嗙ず渚?/span></a></p> <p>涓嬮潰浠ュ浐瀹氬唴瀛樻睜涓轟緥璇存槑鍐呭瓨姹犵殑宸ヤ綔鍘熺悊錛屽鍥?-1鎵紺恒?/p> <br><a name=N10177><strong>鍥?-1 鍥哄畾鍐呭瓨姹?/strong></a><br><img border=0 alt="鍥?-1 鍥哄畾鍐呭瓨姹? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_1.gif" width=498 height=211> <br> <p>鍥哄畾鍐呭瓨姹犵敱涓緋誨垪鍥哄畾澶у皬鐨勫唴瀛樺潡緇勬垚錛屾瘡涓涓唴瀛樺潡鍙堝寘鍚簡鍥哄畾鏁伴噺鍜屽ぇ灝忕殑鍐呭瓨鍗曞厓銆?/p> <p>濡傚浘6-1鎵紺猴紝璇ュ唴瀛樻睜涓鍏卞寘鍚?涓唴瀛樺潡銆傚湪鍐呭瓨姹犲垵嬈$敓鎴愭椂錛屽彧鍚戠郴緇熺敵璇蜂簡涓涓唴瀛樺潡錛岃繑鍥炵殑鎸囬拡浣滀負鏁翠釜鍐呭瓨姹犵殑澶存寚閽堛備箣鍚庨殢鐫搴旂敤紼嬪簭瀵瑰唴瀛樼殑涓嶆柇闇姹傦紝鍐呭瓨姹犲垽鏂渶瑕佸姩鎬佹墿澶ф椂錛屾墠鍐嶆鍚戠郴緇熺敵璇鋒柊鐨勫唴瀛樺潡錛屽茍鎶婃墍鏈夎繖浜涘唴瀛樺潡閫氳繃鎸囬拡閾炬帴璧鋒潵銆傚浜庢搷浣滅郴緇熸潵璇達紝瀹冨凡緇忎負璇ュ簲鐢ㄧ▼搴忓垎閰嶄簡4涓瓑澶у皬鐨勫唴瀛樺潡銆傜敱浜庢槸澶у皬鍥哄畾鐨勶紝鎵浠ュ垎閰嶇殑閫熷害姣旇緝蹇紱鑰屽浜庡簲鐢ㄧ▼搴忔潵璇達紝鍏跺唴瀛樻睜寮杈熶簡涓瀹氬ぇ灝忥紝鍐呭瓨姹犲唴閮ㄥ嵈榪樻湁鍓╀綑鐨勭┖闂淬?/p> <p>渚嬪鏀懼ぇ鏉ョ湅絎?涓唴瀛樺潡錛屽叾涓寘鍚竴閮ㄥ垎鍐呭瓨姹犲潡澶翠俊鎭拰3涓ぇ灝忕浉絳夌殑鍐呭瓨姹犲崟鍏冦傚崟鍏?鍜屽崟鍏?鏄┖闂茬殑錛屽崟鍏?宸茬粡鍒嗛厤銆傚綋搴旂敤紼嬪簭闇瑕侀氳繃璇ュ唴瀛樻睜鍒嗛厤涓涓崟鍏冨ぇ灝忕殑鍐呭瓨鏃訛紝鍙渶瑕佺畝鍗曢亶鍘嗘墍鏈夌殑鍐呭瓨姹犲潡澶翠俊鎭紝蹇熷畾浣嶅埌榪樻湁絀洪棽鍗曞厓鐨勯偅涓唴瀛樻睜鍧椼傜劧鍚庢牴鎹鍧楃殑鍧楀ご淇℃伅鐩存帴瀹氫綅鍒扮1涓┖闂茬殑鍗曞厓鍦板潃錛屾妸榪欎釜鍦板潃榪斿洖錛屽茍涓旀爣璁頒笅涓涓┖闂插崟鍏冨嵆鍙紱褰撳簲鐢ㄧ▼搴忛噴鏀炬煇涓涓唴瀛樻睜鍗曞厓鏃訛紝鐩存帴鍦ㄥ搴旂殑鍐呭瓨姹犲潡澶翠俊鎭腑鏍囪璇ュ唴瀛樺崟鍏冧負絀洪棽鍗曞厓鍗沖彲銆?/p> <p>鍙涓庣郴緇熺鐞嗗唴瀛樼浉姣旓紝鍐呭瓨姹犵殑鎿嶄綔闈炲父榪呴燂紝瀹冨湪鎬ц兘浼樺寲鏂歸潰鐨勪紭鐐逛富瑕佸涓嬨?/p> <p>錛?錛夐拡瀵圭壒孌婃儏鍐碉紝渚嬪闇瑕侀綣佸垎閰嶉噴鏀懼浐瀹氬ぇ灝忕殑鍐呭瓨瀵硅薄鏃訛紝涓嶉渶瑕佸鏉傜殑鍒嗛厤綆楁硶鍜屽綰跨▼淇濇姢銆備篃涓嶉渶瑕佺淮鎶ゅ唴瀛樼┖闂茶〃鐨勯澶栧紑閿錛屼粠鑰岃幏寰楄緝楂樼殑鎬ц兘銆?/p> <p>錛?錛夌敱浜庡紑杈熶竴瀹氭暟閲忕殑榪炵畫鍐呭瓨絀洪棿浣滀負鍐呭瓨姹犲潡錛屽洜鑰屼竴瀹氱▼搴︿笂鎻愰珮浜嗙▼搴忓眬閮ㄦэ紝鎻愬崌浜嗙▼搴忔ц兘銆?/p> <p>錛?錛夋瘮杈冨鏄撴帶鍒墮〉杈圭晫瀵歸綈鍜屽唴瀛樺瓧鑺傚榻愶紝娌℃湁鍐呭瓨紕庣墖鐨勯棶棰樸?/p> <div id="hvzpftn" class=ibm-alternate-rule></div> <p class="ibm-ind-link ibm-back-to-top"><a class=ibm-anchor-up-link ><u><font color=#0066cc>鍥為〉棣?/font></u></a></p> <p><a name=N1019C><span id="hvzpftn" class=atitle>6.2 涓涓唴瀛樻睜鐨勫疄鐜板疄渚?/span></a></p> <p>鏈妭鍒嗘瀽鍦ㄦ煇涓ぇ鍨嬪簲鐢ㄧ▼搴忓疄闄呭簲鐢ㄥ埌鐨勪竴涓唴瀛樻睜瀹炵幇錛屽茍璇︾粏璁茶В鍏朵嬌鐢ㄦ柟娉曚笌宸ヤ綔鍘熺悊銆傝繖鏄竴涓簲鐢ㄤ簬鍗曠嚎紼嬬幆澧冧笖鍒嗛厤鍗曞厓澶у皬鍥哄畾鐨勫唴瀛樻睜錛屼竴鑸敤鏉ヤ負鎵ц鏃朵細鍔ㄦ侀綣佸湴鍒涘緩涓斿彲鑳戒細琚嬈″垱寤虹殑綾誨璞℃垨鑰呯粨鏋勪綋鍒嗛厤鍐呭瓨銆?/p> <p>鏈妭棣栧厛璁茶В璇ュ唴瀛樻睜鐨勬暟鎹粨鏋勫0鏄庡強鍥劇ず錛屾帴鐫鎻忚堪鍏跺師鐞嗗強琛屼負鐗瑰緛銆傜劧鍚庨愪竴璁茶В瀹炵幇緇嗚妭錛屾渶鍚庝粙緇嶅浣曞湪瀹為檯紼嬪簭涓簲鐢ㄦ鍐呭瓨姹狅紝騫朵笌浣跨敤鏅氬唴瀛樺嚱鏁扮敵璇峰唴瀛樼殑紼嬪簭鎬ц兘浣滄瘮杈冦?/p> <p><a name=N101A8><span id="hvzpftn" class=smalltitle>6.2.1 鍐呴儴鏋勯?/span></a></p> <p>鍐呭瓨姹犵被MemoryPool鐨勫0鏄庡涓嬶細</p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>class MemoryPool { private: MemoryBlock* pBlock; USHORT nUnitSize; USHORT nInitSize; USHORT nGrowSize; public: MemoryPool( USHORT nUnitSize, USHORT nInitSize = 1024, USHORT nGrowSize = 256 ); ~MemoryPool(); void* Alloc(); void Free( void* p ); }; </pre> </td> </tr> </tbody> </table> <br> <p>MemoryBlock涓哄唴瀛樻睜涓檮鐫鍦ㄧ湡姝g敤鏉ヤ負鍐呭瓨璇鋒眰鍒嗛厤鍐呭瓨鐨勫唴瀛樺潡澶撮儴鐨勭粨鏋勪綋錛屽畠鎻忚堪浜嗕笌涔嬭仈緋葷殑鍐呭瓨鍧楃殑浣跨敤淇℃伅錛?/p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>struct MemoryBlock { USHORT nSize; USHORT nFree; USHORT nFirst; USHORT nDummyAlign1; MemoryBlock* pNext; char aData[1]; static void* operator new(size_t, USHORT nTypes, USHORT nUnitSize) { return ::operator new(sizeof(MemoryBlock) + nTypes * nUnitSize); } static void operator delete(void *p, size_t) { ::operator delete (p); } MemoryBlock (USHORT nTypes = 1, USHORT nUnitSize = 0); ~MemoryBlock() {} }; </pre> </td> </tr> </tbody> </table> <br> <p>姝ゅ唴瀛樻睜鐨勬暟鎹粨鏋勫鍥?-2鎵紺恒?/p> <br><a name=N101CB><strong>鍥?-2 鍐呭瓨姹犵殑鏁版嵁緇撴瀯</strong></a><br><img border=0 alt="鍥?-2 鍐呭瓨姹犵殑鏁版嵁緇撴瀯" src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_2.gif" width=544 height=369> <br> <p><a name=N101DB><span id="hvzpftn" class=smalltitle>6.2.2 鎬諱綋鏈哄埗</span></a></p> <p>姝ゅ唴瀛樻睜鐨勬諱綋鏈哄埗濡備笅銆?/p> <p>錛?錛夊湪榪愯榪囩▼涓紝MemoryPool鍐呭瓨姹犲彲鑳戒細鏈夊涓敤鏉ユ弧瓚沖唴瀛樼敵璇瘋姹傜殑鍐呭瓨鍧楋紝榪欎簺鍐呭瓨鍧楁槸浠庤繘紼嬪爢涓紑杈熺殑涓涓緝澶х殑榪炵畫鍐呭瓨鍖哄煙錛屽畠鐢變竴涓狹emoryBlock緇撴瀯浣撳拰澶氫釜鍙緵鍒嗛厤鐨勫唴瀛樺崟鍏冪粍鎴愶紝鎵鏈夊唴瀛樺潡緇勬垚浜嗕竴涓唴瀛樺潡閾捐〃錛孧emoryPool 鐨刾Block鏄繖涓摼琛ㄧ殑澶淬傚姣忎釜鍐呭瓨鍧楋紝閮藉彲浠ラ氳繃鍏跺ご閮ㄧ殑MemoryBlock緇撴瀯浣撶殑pNext鎴愬憳璁塊棶绱ц窡鍦ㄥ叾鍚庨潰鐨勯偅涓唴瀛樺潡銆?/p> <p>錛?錛夋瘡涓唴瀛樺潡鐢變袱閮ㄥ垎緇勬垚錛屽嵆涓涓狹emoryBlock緇撴瀯浣撳拰澶氫釜鍐呭瓨鍒嗛厤鍗曞厓銆傝繖浜涘唴瀛樺垎閰嶅崟鍏冨ぇ灝忓浐瀹氾紙鐢?MemoryPool鐨刵UnitSize琛ㄧず錛夛紝MemoryBlock緇撴瀯浣撳茍涓嶇淮鎶ら偅浜涘凡緇忓垎閰嶇殑鍗曞厓鐨勪俊鎭紱鐩稿弽錛屽畠鍙淮鎶ゆ病鏈夊垎閰嶇殑鑷敱鍒嗛厤鍗曞厓鐨勪俊鎭傚畠鏈変袱涓垚鍛樻瘮杈冮噸瑕侊細nFree鍜宯First銆俷Free璁板綍榪欎釜鍐呭瓨鍧椾腑榪樻湁澶氬皯涓嚜鐢卞垎閰嶅崟鍏冿紝鑰宯First鍒欒褰曚笅涓涓彲渚涘垎閰嶇殑鍗曞厓鐨勭紪鍙楓傛瘡涓涓嚜鐢卞垎閰嶅崟鍏冪殑澶翠袱涓瓧鑺傦紙鍗充竴涓猆SHORT鍨嬪鹼級璁板綍浜嗙揣璺熷畠涔嬪悗鐨勪笅涓涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿錛岃繖鏍鳳紝閫氳繃鍒╃敤姣忎釜鑷敱鍒嗛厤鍗曞厓鐨勫ご涓や釜瀛楄妭錛屼竴涓狹emoryBlock涓殑鎵鏈夎嚜鐢卞垎閰嶅崟鍏冭閾炬帴璧鋒潵銆?/p> <p>錛?錛夊綋鏈夋柊鐨勫唴瀛樿姹傚埌鏉ユ椂錛孧emoryPool浼氶氳繃pBlock閬嶅巻MemoryBlock閾捐〃錛岀洿鍒版壘鍒版煇涓?MemoryBlock鎵鍦ㄧ殑鍐呭瓨鍧楋紝鍏朵腑榪樻湁鑷敱鍒嗛厤鍗曞厓錛堥氳繃媯嫻婱emoryBlock緇撴瀯浣撶殑nFree鎴愬憳鏄惁澶т簬0錛夈傚鏋滄壘鍒拌繖鏍風殑鍐呭瓨鍧楋紝鍙栧緱鍏禡emoryBlock鐨刵First鍊鹼紙姝や負璇ュ唴瀛樺潡涓1涓彲渚涘垎閰嶇殑鑷敱鍗曞厓鐨勭紪鍙鳳級銆傜劧鍚庢牴鎹繖涓紪鍙峰畾浣嶅埌璇ヨ嚜鐢卞垎閰嶅崟鍏冪殑璧峰浣嶇疆錛堝洜涓烘墍鏈夊垎閰嶅崟鍏冨ぇ灝忓浐瀹氾紝鍥犳姣忎釜鍒嗛厤鍗曞厓鐨勮搗濮嬩綅緗兘鍙互閫氳繃緙栧彿鍒嗛厤鍗曞厓澶у皬鏉ュ亸縐誨畾浣嶏級錛岃繖涓綅緗氨鏄敤鏉ユ弧瓚蟲嬈″唴瀛樼敵璇瘋姹傜殑鍐呭瓨鐨勮搗濮嬪湴鍧銆備絾鍦ㄨ繑鍥炶繖涓湴鍧鍓嶏紝闇瑕侀鍏堝皢璇ヤ綅緗紑濮嬬殑澶翠袱涓瓧鑺傜殑鍊鹼紙榪欎袱涓瓧鑺傚艱褰曞叾涔嬪悗鐨勪笅涓涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿錛夎祴緇欐湰鍐呭瓨鍧楃殑 MemoryBlock鐨刵First鎴愬憳銆傝繖鏍蜂笅涓嬈$殑璇鋒眰灝變細鐢ㄨ繖涓紪鍙峰搴旂殑鍐呭瓨鍗曞厓鏉ユ弧瓚籌紝鍚屾椂灝嗘鍐呭瓨鍧楃殑MemoryBlock鐨刵Free 閫掑噺1錛岀劧鍚庢墠灝嗗垰鎵嶅畾浣嶅埌鐨勫唴瀛樺崟鍏冪殑璧峰浣嶇疆浣滀負姝ゆ鍐呭瓨璇鋒眰鐨勮繑鍥炲湴鍧榪斿洖緇欒皟鐢ㄨ呫?/p> <p>錛?錛夊鏋滀粠鐜版湁鐨勫唴瀛樺潡涓壘涓嶅埌涓涓嚜鐢辯殑鍐呭瓨鍒嗛厤鍗曞厓錛堝綋絎?嬈¤姹傚唴瀛橈紝浠ュ強鐜版湁鐨勬墍鏈夊唴瀛樺潡涓殑鎵鏈夊唴瀛樺垎閰嶅崟鍏冮兘宸茬粡琚垎閰嶆椂浼氬彂鐢熻繖縐嶆儏褰級錛孧emoryPool灝變細浠庤繘紼嬪爢涓敵璇蜂竴涓唴瀛樺潡錛堣繖涓唴瀛樺潡鍖呮嫭涓涓狹emoryBlock緇撴瀯浣擄紝鍙婄揣閭誨叾鍚庣殑澶氫釜鍐呭瓨鍒嗛厤鍗曞厓錛屽亣璁懼唴瀛樺垎閰嶅崟鍏冪殑涓暟涓簄錛宯鍙互鍙栧糓emoryPool涓殑nInitSize鎴栬卬GrowSize錛夛紝鐢寵瀹屽悗錛屽茍涓嶄細绔嬪埢灝嗗叾涓殑涓涓垎閰嶅崟鍏冨垎閰嶅嚭鍘伙紝鑰屾槸闇瑕侀鍏堝垵濮嬪寲榪欎釜鍐呭瓨鍧椼傚垵濮嬪寲鐨勬搷浣滃寘鎷緗甅emoryBlock鐨刵Size涓烘墍鏈夊唴瀛樺垎閰嶅崟鍏冪殑澶у皬錛堟敞鎰忥紝騫朵笉鍖呮嫭MemoryBlock緇撴瀯浣撶殑澶у皬錛夈乶Free涓簄-1錛堟敞鎰忥紝榪欓噷鏄痭-1鑰屼笉鏄痭錛屽洜涓烘嬈℃柊鍐呭瓨鍧楀氨鏄負浜嗘弧瓚充竴嬈℃柊鐨勫唴瀛樿姹傝岀敵璇風殑錛岄┈涓婂氨浼氬垎閰嶄竴鍧楄嚜鐢卞瓨鍌ㄥ崟鍏冨嚭鍘伙紝濡傛灉璁句負n-1錛屽垎閰嶄竴涓嚜鐢卞瓨鍌ㄥ崟鍏冨悗鏃犻』鍐嶅皢n閫掑噺1錛夛紝nFirst涓?錛堝凡緇忕煡閬搉First涓轟笅涓涓彲浠ュ垎閰嶇殑鑷敱瀛樺偍鍗曞厓鐨勭紪鍙楓備負1鐨勫師鍥犱笌nFree涓簄-1鐩稿悓錛屽嵆绔嬪嵆浼氬皢緙栧彿涓?鐨勮嚜鐢卞垎閰嶅崟鍏冨垎閰嶅嚭鍘匯傜幇鍦ㄨ涓?錛屽叾鍚庝笉鐢ㄤ慨鏀筺First鐨勫鹼級錛孧emoryBlock鐨勬瀯閫犻渶瑕佸仛鏇撮噸瑕佺殑浜嬫儏錛屽嵆灝嗙紪鍙蜂負0鐨勫垎閰嶅崟鍏冧箣鍚庣殑鎵鏈夎嚜鐢卞垎閰嶅崟鍏冮摼鎺ヨ搗鏉ャ傚鍓嶆墍榪幫紝姣忎釜鑷敱鍒嗛厤鍗曞厓鐨勫ご涓や釜瀛楄妭鐢ㄦ潵瀛樺偍涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿銆傚彟澶栵紝鍥犱負姣忎釜鍒嗛厤鍗曞厓澶у皬鍥哄畾錛屾墍浠ュ彲浠ラ氳繃鍏剁紪鍙峰拰鍗曞厓澶у皬錛圡emoryPool鐨刵UnitSize鎴愬憳錛夌殑涔樼Н浣滀負鍋忕Щ鍊艱繘琛屽畾浣嶃傜幇鍦ㄥ敮涓鐨勯棶棰樻槸瀹氫綅浠庡摢涓湴鍧寮濮嬶紵絳旀鏄疢emoryBlock鐨刟Data[1]鎴愬憳寮濮嬨傚洜涓篴Data[1]瀹為檯涓婃槸灞炰簬MemoryBlock緇撴瀯浣撶殑錛圡emoryBlock緇撴瀯浣撶殑鏈鍚庝竴涓瓧鑺傦級錛屾墍浠ュ疄璐ㄤ笂錛孧emoryBlock緇撴瀯浣撶殑鏈鍚庝竴涓瓧鑺備篃鐢ㄥ仛琚垎閰嶅嚭鍘葷殑鍒嗛厤鍗曞厓鐨勪竴閮ㄥ垎銆傚洜涓烘暣涓唴瀛樺潡鐢盡emoryBlock緇撴瀯浣撳拰鏁存暟涓垎閰嶅崟鍏冪粍鎴愶紝榪欐剰鍛崇潃鍐呭瓨鍧楃殑鏈鍚庝竴涓瓧鑺備細琚氮璐癸紝榪欎釜瀛楄妭鍦ㄥ浘6-2涓敤浣嶄簬涓や釜鍐呭瓨鐨勬渶鍚庨儴鍒嗙殑嫻撻粦鑳屾櫙鐨勫皬鍧楁爣璇嗐傜‘瀹氫簡鍒嗛厤鍗曞厓鐨勮搗濮嬩綅緗悗錛屽皢鑷敱鍒嗛厤鍗曞厓閾炬帴璧鋒潵鐨勫伐浣滃氨寰堝鏄撲簡銆傚嵆浠巃Data浣嶇疆寮濮嬶紝姣忛殧nUnitSize澶у皬鍙栧叾澶翠袱涓瓧鑺傦紝璁板綍鍏朵箣鍚庣殑鑷敱鍒嗛厤鍗曞厓鐨勭紪鍙楓傚洜涓哄垰寮濮嬫墍鏈夊垎閰嶅崟鍏冮兘鏄嚜鐢辯殑錛屾墍浠ヨ繖涓紪鍙峰氨鏄嚜韜紪鍙峰姞1錛屽嵆浣嶇疆涓婄揣璺熷叾鍚庣殑鍗曞厓鐨勭紪鍙楓傚垵濮嬪寲鍚庯紝灝嗘鍐呭瓨鍧楃殑絎?涓垎閰嶅崟鍏冪殑璧峰鍦板潃榪斿洖錛屽凡緇忕煡閬撹繖涓湴鍧灝辨槸aData銆?/p> <p>錛?錛夊綋鏌愪釜琚垎閰嶇殑鍗曞厓鍥犱負delete闇瑕佸洖鏀舵椂錛岃鍗曞厓騫朵笉浼氳繑鍥炵粰榪涚▼鍫嗭紝鑰屾槸榪斿洖緇橫emoryPool銆傝繑鍥炴椂錛孧emoryPool鑳藉鐭ラ亾璇ュ崟鍏冪殑璧峰鍦板潃銆傝繖鏃訛紝MemoryPool寮濮嬮亶鍘嗗叾鎵緇存姢鐨勫唴瀛樺潡閾捐〃錛屽垽鏂鍗曞厓鐨勮搗濮嬪湴鍧鏄惁钀藉湪鏌愪釜鍐呭瓨鍧楃殑鍦板潃鑼冨洿鍐呫傚鏋滀笉鍦ㄦ墍鏈夊唴瀛樺湴鍧鑼冨洿鍐咃紝鍒欒繖涓鍥炴敹鐨勫崟鍏冧笉灞炰簬榪欎釜MemoryPool錛涘鏋滃湪鏌愪釜鍐呭瓨鍧楃殑鍦板潃鑼冨洿鍐咃紝閭d箞瀹冧細灝嗚繖涓垰鍒氬洖鏀剁殑鍒嗛厤鍗曞厓鍔犲埌榪欎釜鍐呭瓨鍧楃殑MemoryBlock鎵緇存姢鐨勮嚜鐢卞垎閰嶅崟鍏冮摼琛ㄧ殑澶撮儴錛屽悓鏃跺皢鍏秐Free鍊奸掑1銆傚洖鏀跺悗錛岃冭檻鍒拌祫婧愮殑鏈夋晥鍒╃敤鍙婂悗緇搷浣滅殑鎬ц兘錛屽唴瀛樻睜鐨勬搷浣滀細緇х畫鍒ゆ柇錛氬鏋滄鍐呭瓨鍧楃殑鎵鏈夊垎閰嶅崟鍏冮兘鏄嚜鐢辯殑錛岄偅涔堣繖涓唴瀛樺潡灝變細浠嶮emoryPool涓縐誨嚭騫朵綔涓轟竴涓暣浣撹繑鍥炵粰榪涚▼鍫嗭紱濡傛灉璇ュ唴瀛樺潡涓繕鏈夐潪鑷敱鍒嗛厤鍗曞厓錛岃繖鏃朵笉鑳藉皢姝ゅ唴瀛樺潡榪斿洖緇欒繘紼嬪爢銆備絾鏄洜涓哄垰鍒氭湁涓涓垎閰嶅崟鍏冭繑鍥炵粰浜嗚繖涓唴瀛樺潡錛屽嵆榪欎釜鍐呭瓨鍧楁湁鑷敱鍒嗛厤鍗曞厓鍙緵涓嬫鍒嗛厤錛屽洜姝ゅ畠浼氳縐誨埌MemoryPool緇存姢鐨勫唴瀛樺潡鐨勫ご閮ㄣ傝繖鏍蜂笅嬈$殑鍐呭瓨璇鋒眰鍒版潵錛孧emoryPool閬嶅巻鍏跺唴瀛樺潡閾捐〃浠ュ鎵捐嚜鐢卞垎閰嶅崟鍏冩椂錛岀1嬈″鎵懼氨浼氭壘鍒拌繖涓唴瀛樺潡銆傚洜涓鴻繖涓唴瀛樺潡紜疄鏈夎嚜鐢卞垎閰嶅崟鍏冿紝榪欐牱鍙互鍑忓皯MemoryPool鐨勯亶鍘嗘鏁般?/p> <p>緇間笂鎵榪幫紝姣忎釜鍐呭瓨姹狅紙MemoryPool錛夌淮鎶や竴涓唴瀛樺潡閾捐〃錛堝崟閾捐〃錛夛紝姣忎釜鍐呭瓨鍧楃敱涓涓淮鎶よ鍐呭瓨鍧椾俊鎭殑鍧楀ご緇撴瀯錛圡emoryBlock錛夊拰澶氫釜鍒嗛厤鍗曞厓緇勬垚錛屽潡澶寸粨鏋凪emoryBlock鍒欒繘涓姝ョ淮鎶や竴涓鍐呭瓨鍧楃殑鎵鏈夎嚜鐢卞垎閰嶅崟鍏冪粍鎴愮殑"閾捐〃"銆傝繖涓摼琛ㄤ笉鏄氳繃"鎸囧悜涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冪殑鎸囬拡"閾炬帴璧鋒潵鐨勶紝鑰屾槸閫氳繃"涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿"閾炬帴璧鋒潵錛岃繖涓紪鍙峰煎瓨鍌ㄥ湪璇ヨ嚜鐢卞垎閰嶅崟鍏冪殑澶翠袱涓瓧鑺備腑銆傚彟澶栵紝絎?涓嚜鐢卞垎閰嶅崟鍏冪殑璧峰浣嶇疆騫朵笉鏄疢emoryBlock緇撴瀯浣?鍚庨潰鐨?絎?涓湴鍧浣嶇疆錛岃屾槸MemoryBlock緇撴瀯浣?鍐呴儴"鐨勬渶鍚庝竴涓瓧鑺俛Data錛堜篃鍙兘涓嶆槸鏈鍚庝竴涓紝鍥犱負鑰冭檻鍒板瓧鑺傚榻愮殑闂錛夛紝鍗沖垎閰嶅崟鍏冨疄闄呬笂寰鍓嶉潰閿欎簡涓浣嶃傚張鍥犱負MemoryBlock緇撴瀯浣撳悗闈㈢殑絀洪棿鍒氬ソ鏄垎閰嶅崟鍏冪殑鏁存暟鍊嶏紝榪欐牱渚濇閿欎綅涓嬪幓錛屽唴瀛樺潡鐨勬渶鍚庝竴涓瓧鑺傚疄闄呮病鏈夎鍒╃敤銆傝繖涔堝仛鐨勪竴涓師鍥犱篃鏄冭檻鍒頒笉鍚屽鉤鍙扮殑縐繪闂錛屽洜涓轟笉鍚屽鉤鍙扮殑瀵歸綈鏂瑰紡鍙兘涓嶅敖鐩稿悓銆傚嵆褰撶敵璇稭emoryBlock澶у皬鍐呭瓨鏃訛紝鍙兘浼氳繑鍥炴瘮鍏舵墍鏈夋垚鍛樺ぇ灝忔誨拰榪樿澶т竴浜涚殑鍐呭瓨銆傛渶鍚庣殑鍑犱釜瀛楄妭鏄負浜?琛ラ綈"錛岃屼嬌寰?aData鎴愪負絎?涓垎閰嶅崟鍏冪殑璧峰浣嶇疆錛岃繖鏍峰湪瀵歸綈鏂瑰紡涓嶅悓鐨勫悇縐嶅鉤鍙頒笂閮藉彲浠ュ伐浣溿?/p> <p><a name=N101F6><span id="hvzpftn" class=smalltitle>6.2.3 緇嗚妭鍓栨瀽</span></a></p> <p>鏈変簡涓婅堪鐨勬諱綋鍗拌薄鍚庯紝鏈妭鏉ヤ粩緇嗗墫鏋愬叾瀹炵幇緇嗚妭銆?/p> <p>錛?錛塎emoryPool鐨勬瀯閫犲涓嬶細</p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>MemoryPool::MemoryPool( USHORT _nUnitSize, USHORT _nInitSize, USHORT _nGrowSize ) { pBlock = NULL; 鈶? nInitSize = _nInitSize; 鈶? nGrowSize = _nGrowSize; 鈶? if ( _nUnitSize > 4 ) nUnitSize = (_nUnitSize + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1); 鈶? else if ( _nUnitSize <= 2 ) nUnitSize = 2; 鈶? else nUnitSize = 4; } </pre> </td> </tr> </tbody> </table> <br> <p>浠庘憼澶勫彲浠ョ湅鍑猴紝MemoryPool鍒涘緩鏃訛紝騫舵病鏈夌珛鍒誨垱寤虹湡姝g敤鏉ユ弧瓚沖唴瀛樼敵璇風殑鍐呭瓨鍧楋紝鍗沖唴瀛樺潡閾捐〃鍒氬紑濮嬫椂涓虹┖銆?/p> <p>鈶″鍜屸憿澶勫垎鍒緗?絎?嬈″垱寤虹殑鍐呭瓨鍧楁墍鍖呭惈鐨勫垎閰嶅崟鍏冪殑涓暟"錛屽強"闅忓悗鍒涘緩鐨勫唴瀛樺潡鎵鍖呭惈鐨勫垎閰嶅崟鍏冪殑涓暟"錛岃繖涓や釜鍊煎湪MemoryPool鍒涘緩鏃墮氳繃鍙傛暟鎸囧畾錛屽叾鍚庡湪璇emoryPool瀵硅薄鐢熷懡鍛ㄦ湡涓竴鐩翠笉鍙樸?/p> <p>鍚庨潰鐨勪唬鐮佺敤鏉ヨ緗畁UnitSize錛岃繖涓煎弬鑰冧紶鍏ョ殑_nUnitSize鍙傛暟銆備絾鏄繕闇瑕佽冭檻涓や釜鍥犵礌銆傚鍓嶆墍榪幫紝姣忎釜鍒嗛厤鍗曞厓鍦ㄨ嚜鐢辯姸鎬佹椂錛屽叾澶翠袱涓瓧鑺傜敤鏉ュ瓨鏀?鍏朵笅涓涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿"銆傚嵆姣忎釜鍒嗛厤鍗曞厓"鏈灝?鏈?涓や釜瀛楄妭"錛岃繖灝辨槸鈶ゅ璧嬪肩殑鍘熷洜銆傗懀澶勬槸灝嗗ぇ浜?涓瓧鑺傜殑澶у皬_nUnitSize寰涓?鍙栨暣鍒?澶т簬_nUnitSize鐨勬渶灝忕殑MEMPOOL_ ALIGNMENT鐨勫嶆暟錛堝墠鎻愭槸MEMPOOL_ALIGNMENT涓?鐨勫嶆暟錛夈傚_nUnitSize涓?1 鏃訛紝MEMPOOL_ALIGNMENT涓?錛宯UnitSize涓?6錛汳EMPOOL_ALIGNMENT涓?錛宯UnitSize涓?12錛汳EMPOOL_ALIGNMENT涓?錛宯UnitSize涓?2錛屼緷嬈$被鎺ㄣ?/p> <p>錛?錛夊綋鍚慚emoryPool鎻愬嚭鍐呭瓨璇鋒眰鏃訛細</p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>void* MemoryPool::Alloc() { if ( !pBlock ) 鈶? { …… } MemoryBlock* pMyBlock = pBlock; while (pMyBlock && !pMyBlock->nFree )鈶? pMyBlock = pMyBlock->pNext; if ( pMyBlock ) 鈶? { char* pFree = pMyBlock->aData+(pMyBlock->nFirst*nUnitSize); pMyBlock->nFirst = *((USHORT*)pFree); pMyBlock->nFree--; return (void*)pFree; } else 鈶? { if ( !nGrowSize ) return NULL; pMyBlock = new(nGrowSize, nUnitSize) FixedMemBlock(nGrowSize, nUnitSize); if ( !pMyBlock ) return NULL; pMyBlock->pNext = pBlock; pBlock = pMyBlock; return (void*)(pMyBlock->aData); } } </pre> </td> </tr> </tbody> </table> <br> <p>MemoryPool婊¤凍鍐呭瓨璇鋒眰鐨勬楠や富瑕佺敱鍥涙緇勬垚銆?/p> <p>鈶犲棣栧厛鍒ゆ柇鍐呭瓨姹犲綋鍓嶅唴瀛樺潡閾捐〃鏄惁涓虹┖錛屽鏋滀負絀猴紝鍒欐剰鍛崇潃榪欐槸絎?嬈″唴瀛樼敵璇瘋姹傘傝繖鏃訛紝浠庤繘紼嬪爢涓敵璇蜂竴涓垎閰嶅崟鍏冧釜鏁頒負nInitSize鐨勫唴瀛樺潡錛屽茍鍒濆鍖栬鍐呭瓨鍧楋紙涓昏鍒濆鍖朚emoryBlock緇撴瀯浣撴垚鍛橈紝浠ュ強鍒涘緩鍒濆鐨勮嚜鐢卞垎閰嶅崟鍏冮摼琛紝涓嬮潰浼氳緇嗗垎鏋愬叾浠g爜錛夈傚鏋滆鍐呭瓨鍧楃敵璇鋒垚鍔燂紝騫跺垵濮嬪寲瀹屾瘯錛岃繑鍥炵1涓垎閰嶅崟鍏冪粰璋冪敤鍑芥暟銆傜1涓垎閰嶅崟鍏冧互MemoryBlock緇撴瀯浣撳唴鐨勬渶鍚庝竴涓瓧鑺備負璧峰鍦板潃銆?/p> <p>鈶″鐨勪綔鐢ㄦ槸褰撳唴瀛樻睜涓凡鏈夊唴瀛樺潡錛堝嵆鍐呭瓨鍧楅摼琛ㄤ笉涓虹┖錛夋椂閬嶅巻璇ュ唴瀛樺潡閾捐〃錛屽鎵捐繕鏈?鑷敱鍒嗛厤鍗曞厓"鐨勫唴瀛樺潡銆?/p> <p>鈶㈠媯鏌ュ鏋滄壘鍒拌繕鏈夎嚜鐢卞垎閰嶅崟鍏冪殑鍐呭瓨鍧楋紝鍒?瀹氫綅"鍒拌鍐呭瓨鍧楃幇鍦ㄥ彲浠ョ敤鐨勮嚜鐢卞垎閰嶅崟鍏冨銆?瀹氫綅"浠?MemoryBlock緇撴瀯浣撳唴鐨勬渶鍚庝竴涓瓧鑺備綅緗產Data涓鴻搗濮嬩綅緗紝浠emoryPool鐨刵UnitSize涓烘闀挎潵榪涜銆傛壘鍒板悗錛岄渶瑕佷慨鏀?MemoryBlock鐨刵Free淇℃伅錛堝墿涓嬫潵鐨勮嚜鐢卞垎閰嶅崟鍏冩瘮鍘熸潵鍑忓皯浜嗕竴涓級錛屼互鍙婁慨鏀規鍐呭瓨鍧楃殑鑷敱瀛樺偍鍗曞厓閾捐〃鐨勪俊鎭傚湪鎵懼埌鐨勫唴瀛樺潡涓紝pMyBlock->nFirst涓鴻鍐呭瓨鍧椾腑鑷敱瀛樺偍鍗曞厓閾捐〃鐨勮〃澶達紝鍏朵笅涓涓嚜鐢卞瓨鍌ㄥ崟鍏冪殑緙栧彿瀛樻斁鍦?pMyBlock->nFirst鎸囩ず鐨勮嚜鐢卞瓨鍌ㄥ崟鍏冿紙浜﹀嵆鍒氭墠瀹氫綅鍒扮殑鑷敱瀛樺偍鍗曞厓錛夌殑澶翠袱涓瓧鑺傘傞氳繃鍒氭墠瀹氫綅鍒扮殑浣嶇疆錛屽彇鍏跺ご涓や釜瀛楄妭鐨勫鹼紝璧嬬粰pMyBlock->nFirst錛岃繖灝辨槸姝ゅ唴瀛樺潡鐨勮嚜鐢卞瓨鍌ㄥ崟鍏冮摼琛ㄧ殑鏂扮殑琛ㄥご錛屽嵆涓嬩竴嬈″垎閰嶅嚭鍘葷殑鑷敱鍒嗛厤鍗曞厓鐨勭紪鍙鳳紙濡傛灉nFree澶т簬闆剁殑璇濓級銆備慨鏀圭淮鎶や俊鎭悗錛屽氨鍙互灝嗗垰鎵嶅畾浣嶅埌鐨勮嚜鐢卞垎閰嶅崟鍏冪殑鍦板潃榪斿洖緇欐嬈$敵璇風殑璋冪敤鍑芥暟銆傛敞鎰忥紝鍥犱負榪欎釜鍒嗛厤鍗曞厓宸茬粡琚垎閰嶏紝鑰屽唴瀛樺潡鏃犻』緇存姢宸插垎閰嶇殑鍒嗛厤鍗曞厓錛屽洜姝よ鍒嗛厤鍗曞厓鐨勫ご涓や釜瀛楄妭鐨勪俊鎭凡緇忔病鏈夌敤澶勩傛崲涓搴︾湅錛岃繖涓嚜鐢卞垎閰嶅崟鍏冭繑鍥炵粰璋冪敤鍑芥暟鍚庯紝璋冪敤鍑芥暟濡備綍澶勭疆榪欏潡鍐呭瓨錛屽唴瀛樻睜鏃犱粠鐭ユ檽錛屼篃鏃犻』鐭ユ檽銆傛鍒嗛厤鍗曞厓鍦ㄨ繑鍥炵粰璋冪敤鍑芥暟鏃訛紝鍏跺唴瀹瑰浜庤皟鐢ㄥ嚱鏁版潵璇存槸鏃犳剰涔夌殑銆傚洜姝ゅ嚑涔庡彲浠ヨ偗瀹氳皟鐢ㄥ嚱鏁板湪鐢ㄨ繖涓崟鍏冪殑鍐呭瓨鏃朵細瑕嗙洊鍏跺師鏉ョ殑鍐呭錛屽嵆澶翠袱涓瓧鑺傜殑鍐呭涔熶細琚姽鍘匯傚洜姝ゆ瘡涓瓨鍌ㄥ崟鍏冨茍娌℃湁鍥犱負闇瑕侀摼鎺ヨ屽紩鍏ュ浣欑殑緇存姢淇℃伅錛岃屾槸鐩存帴鍒╃敤鍗曞厓鍐呯殑澶翠袱涓瓧鑺傦紝褰撳叾鍒嗛厤鍚庯紝澶翠袱涓瓧鑺備篃鍙互琚皟鐢ㄥ嚱鏁板埄鐢ㄣ傝屽湪鑷敱鐘舵佹椂錛屽垯鐢ㄦ潵瀛樻斁緇存姢淇℃伅錛屽嵆涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿錛岃繖鏄竴涓湁鏁堝埄鐢ㄥ唴瀛樼殑濂戒緥瀛愩?/p> <p>鈶e琛ㄧず鍦ㄢ憽澶勯亶鍘嗘椂錛屾病鏈夋壘鍒拌繕鏈夎嚜鐢卞垎閰嶅崟鍏冪殑鍐呭瓨鍧楋紝榪欐椂錛岄渶瑕侀噸鏂板悜榪涚▼鍫嗙敵璇蜂竴涓唴瀛樺潡銆傚洜涓轟笉鏄涓嬈$敵璇峰唴瀛樺潡錛屾墍浠ョ敵璇風殑鍐呭瓨鍧楀寘鍚殑鍒嗛厤鍗曞厓涓暟涓簄GrowSize錛岃屼笉鍐嶆槸nInitSize銆備笌鈶犲鐩稿悓錛屽厛鍋氳繖涓柊鐢寵鍐呭瓨鍧楃殑鍒濆鍖栧伐浣滐紝鐒跺悗灝嗘鍐呭瓨鍧楁彃鍏emoryPool鐨勫唴瀛樺潡閾捐〃鐨勫ご閮紝鍐嶅皢姝ゅ唴瀛樺潡鐨勭1涓垎閰嶅崟鍏冭繑鍥炵粰璋冪敤鍑芥暟銆傚皢姝ゆ柊鍐呭瓨鍧楁彃鍏ュ唴瀛樺潡閾捐〃鐨勫ご閮ㄧ殑鍘熷洜鏄鍐呭瓨鍧楄繕鏈夊緢澶氬彲渚涘垎閰嶇殑鑷敱鍒嗛厤鍗曞厓錛堥櫎闈瀗GrowSize絳変簬1錛岃繖搴旇涓嶅お鍙兘銆傚洜涓哄唴瀛樻睜鐨勫惈涔夊氨鏄竴嬈℃у湴浠庤繘紼嬪爢涓敵璇蜂竴澶у潡鍐呭瓨錛屼互渚涘悗緇殑澶氭鐢寵錛夛紝鏀懼湪澶撮儴鍙互浣垮緱鍦ㄤ笅嬈℃敹鍒板唴瀛樼敵璇鋒椂錛屽噺灝戔憽澶勫鍐呭瓨鍧楃殑閬嶅巻鏃墮棿銆?/p> <p>鍙互鐢ㄥ浘6-2鐨凪emoryPool鏉ュ睍紺篗emoryPool::Alloc鐨勮繃紼嬨傚浘6-3鏄煇涓椂鍒籑emoryPool鐨勫唴閮ㄧ姸鎬併?/p> <br><a name=N10234><strong>鍥?-3 鏌愪釜鏃跺埢MemoryPool鐨勫唴閮ㄧ姸鎬?/strong></a><br><img border=0 alt="鍥?-3 鏌愪釜鏃跺埢MemoryPool鐨勫唴閮ㄧ姸鎬? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_3.gif" width=568 height=397> <br> <p>鍥犱負MemoryPool鐨勫唴瀛樺潡閾捐〃涓嶄負絀猴紝鍥犳浼氶亶鍘嗗叾鍐呭瓨鍧楅摼琛ㄣ傚張鍥犱負絎?涓唴瀛樺潡閲屾湁鑷敱鐨勫垎閰嶅崟鍏冿紝鎵浠ヤ細浠庣1涓唴瀛樺潡涓垎閰嶃傛鏌First錛屽叾鍊間負m錛岃繖鏃秔Block->aData+(pBlock->nFirst*nUnitSize) 瀹氫綅鍒扮紪鍙蜂負m鐨勮嚜鐢卞垎閰嶅崟鍏冪殑璧峰浣嶇疆錛堢敤pFree琛ㄧず錛夈傚湪榪斿洖pFree涔嬪墠錛岄渶瑕佷慨鏀規鍐呭瓨鍧楃殑緇存姢淇℃伅銆傞鍏堝皢nFree閫掑噺1錛岀劧鍚庡彇寰?pFree澶勫紑濮嬬殑澶翠袱涓瓧鑺傜殑鍊鹼紙闇瑕佽鏄庣殑鏄紝榪欓噷aData澶勫間負k銆傚叾瀹炰笉鏄繖涓涓瓧鑺傘傝屾槸浠Data鍜岀揣璺熷叾鍚庣殑鍙﹀涓涓瓧鑺傚悎鍦ㄤ竴璧鋒瀯鎴愮殑涓涓猆SHORT鐨勫鹼紝涓嶅彲璇細錛夈傚彂鐜頒負k錛岃繖鏃朵慨鏀筽Block鐨刵First涓簁銆傜劧鍚庯紝榪斿洖pFree銆傛鏃禡emoryPool鐨勭粨鏋勫鍥?6-4鎵紺恒?/p> <br><a name=N10249><strong>鍥?-4 MemoryPool鐨勭粨鏋?/strong></a><br><img border=0 alt="鍥?-4 MemoryPool鐨勭粨鏋? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_4.gif" width=521 height=373> <br> <p>鍙互鐪嬪埌錛屽師鏉ョ殑絎?涓彲渚涘垎閰嶇殑鍗曞厓錛坢緙栧彿澶勶級宸茬粡鏄劇ず涓鴻鍒嗛厤鐨勭姸鎬併傝宲Block鐨刵First宸茬粡鎸囧悜鍘熸潵m鍗曞厓涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿錛屽嵆k銆?/p> <p>錛?錛塎emoryPool鍥炴敹鍐呭瓨鏃訛細</p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>void MemoryPool::Free( void* pFree ) { …… MemoryBlock* pMyBlock = pBlock; while ( ((ULONG)pMyBlock->aData > (ULONG)pFree) || ((ULONG)pFree >= ((ULONG)pMyBlock->aData + pMyBlock->nSize)) )鈶? { …… } pMyBlock->nFree++; 鈶? *((USHORT*)pFree) = pMyBlock->nFirst; 鈶? pMyBlock->nFirst = (USHORT)(((ULONG)pFree-(ULONG)(pBlock->aData)) / nUnitSize);鈶? if (pMyBlock->nFree*nUnitSize == pMyBlock->nSize )鈶? { …… } else { …… } } </pre> </td> </tr> </tbody> </table> <br> <p>濡傚墠鎵榪幫紝鍥炴敹鍒嗛厤鍗曞厓鏃訛紝鍙兘浼氬皢鏁翠釜鍐呭瓨鍧楄繑鍥炵粰榪涚▼鍫嗭紝涔熷彲鑳藉皢琚洖鏀跺垎閰嶅崟鍏冩墍灞炵殑鍐呭瓨鍧楃Щ鑷沖唴瀛樻睜鐨勫唴瀛樺潡閾捐〃鐨勫ご閮ㄣ傝繖涓や釜鎿嶄綔閮介渶瑕佷慨鏀歸摼琛ㄧ粨鏋勩傝繖鏃墮渶瑕佺煡閬撹鍐呭瓨鍧楀湪閾捐〃涓墠涓涓綅緗殑鍐呭瓨鍧椼?/p> <p>鈶犲閬嶅巻鍐呭瓨姹犵殑鍐呭瓨鍧楅摼琛紝紜畾璇ュ緟鍥炴敹鍒嗛厤鍗曞厓錛坧Free錛夎惤鍦ㄥ摢涓涓唴瀛樺潡鐨勬寚閽堣寖鍥村唴錛岄氳繃姣旇緝鎸囬拡鍊兼潵紜畾銆?/p> <p>榪愯鍒扳憽澶勶紝pMyBlock鍗蟲壘鍒扮殑鍖呭惈pFree鎵鎸囧悜鐨勫緟鍥炴敹鍒嗛厤鍗曞厓鐨勫唴瀛樺潡錛堝綋鐒訛紝榪欐椂搴旇榪橀渶瑕佹鏌?pMyBlock涓篘ULL鏃剁殑鎯呭艦錛屽嵆pFree涓嶅睘浜庢鍐呭瓨姹犵殑鑼冨洿錛屽洜姝や笉鑳借繑鍥炵粰姝ゅ唴瀛樻睜錛岃鑰呭彲浠ヨ嚜琛屽姞涓婏級銆傝繖鏃跺皢pMyBlock鐨?nFree閫掑1錛岃〃紺烘鍐呭瓨鍧楃殑鑷敱鍒嗛厤鍗曞厓澶氫簡涓涓?/p> <p>鈶㈠鐢ㄦ潵淇敼璇ュ唴瀛樺潡鐨勮嚜鐢卞垎閰嶅崟鍏冮摼琛ㄧ殑淇℃伅錛屽畠灝嗚繖涓緟鍥炴敹鍒嗛厤鍗曞厓鐨勫ご涓や釜瀛楄妭鐨勫兼寚鍚戣鍐呭瓨鍧楀師鏉ョ殑絎竴涓彲鍒嗛厤鐨勮嚜鐢卞垎閰嶅崟鍏冪殑緙栧彿銆?/p> <p>鈶e灝唒MyBlock鐨刵First鍊兼敼鍙樹負鎸囧悜榪欎釜寰呭洖鏀跺垎閰嶅崟鍏冪殑緙栧彿錛屽叾緙栧彿閫氳繃璁$畻姝ゅ崟鍏冪殑璧峰浣嶇疆鐩稿pMyBlock鐨刟Data浣嶇疆鐨勫樊鍊鹼紝鐒跺悗闄や互姝ラ暱錛坣UnitSize錛夊緱鍒般?/p> <p>瀹炶川涓婏紝鈶㈠拰鈶d袱姝ョ殑浣滅敤灝辨槸灝嗘寰呭洖鏀跺垎閰嶅崟鍏?鐪熸鍥炴敹"銆傚煎緱娉ㄦ剰鐨勬槸錛岃繖涓ゆ瀹為檯涓婃槸浣垮緱姝ゅ洖鏀跺崟鍏冩垚涓烘鍐呭瓨鍧楃殑涓嬩竴涓彲鍒嗛厤鐨勮嚜鐢卞垎閰嶅崟鍏冿紝鍗沖皢瀹冩斁鍦ㄤ簡鑷敱鍒嗛厤鍗曞厓閾捐〃鐨勫ご閮ㄣ傛敞鎰忥紝鍏跺唴瀛樺湴鍧騫舵病鏈夊彂鐢熸敼鍙樸傚疄闄呬笂錛屼竴涓垎閰嶅崟鍏冪殑鍐呭瓨鍦板潃鏃犺鏄湪鍒嗛厤鍚庯紝榪樻槸澶勪簬鑷敱鐘舵佹椂錛屼竴鐩撮兘涓嶄細鍙樺寲銆傚彉鍖栫殑鍙槸鍏剁姸鎬侊紙宸插垎閰?鑷敱錛夛紝浠ュ強褰撳叾澶勪簬鑷敱鐘舵佹椂鍦ㄨ嚜鐢卞垎閰嶅崟鍏冮摼琛ㄤ腑鐨勪綅緗?/p> <p>鈶ゅ媯鏌ュ綋鍥炴敹瀹屾瘯鍚庯紝鍖呭惈姝ゅ洖鏀跺崟鍏冪殑鍐呭瓨鍧楃殑鎵鏈夊崟鍏冩槸鍚﹂兘澶勪簬鑷敱鐘舵侊紝涓旀鍐呭瓨鏄惁澶勪簬鍐呭瓨鍧楅摼琛ㄧ殑澶撮儴銆傚鏋滄槸錛屽皢姝ゅ唴瀛樺潡鏁翠釜鐨勮繑鍥炵粰榪涚▼鍫嗭紝鍚屾椂淇敼鍐呭瓨鍧楅摼琛ㄧ粨鏋勩?/p> <p>娉ㄦ剰錛岃繖閲屽湪鍒ゆ柇涓涓唴瀛樺潡鐨勬墍鏈夊崟鍏冩槸鍚﹂兘澶勪簬鑷敱鐘舵佹椂錛屽茍娌℃湁閬嶅巻鍏舵墍鏈夊崟鍏冿紝鑰屾槸鍒ゆ柇nFree涔樹互 nUnitSize鏄惁絳変簬nSize銆俷Size鏄唴瀛樺潡涓墍鏈夊垎閰嶅崟鍏冪殑澶у皬錛岃屼笉鍖呮嫭澶撮儴MemoryBlock緇撴瀯浣撶殑澶у皬銆傝繖閲屽彲浠ョ湅鍒板叾鐢ㄦ剰錛屽嵆鐢ㄦ潵蹇熸鏌ユ煇涓唴瀛樺潡涓墍鏈夊垎閰嶅崟鍏冩槸鍚﹀叏閮ㄥ浜庤嚜鐢辯姸鎬併傚洜涓哄彧闇緇撳悎nFree鍜宯UnitSize鏉ヨ綆楀緱鍑虹粨璁猴紝鑰屾棤欏婚亶鍘嗗拰璁$畻鎵鏈夎嚜鐢辯姸鎬佺殑鍒嗛厤鍗曞厓鐨勪釜鏁般?/p> <p>鍙﹀榪橀渶娉ㄦ剰鐨勬槸錛岃繖閲屽茍涓嶈兘姣旇緝nFree涓巒InitSize鎴杗GrowSize鐨勫ぇ灝忔潵鍒ゆ柇鏌愪釜鍐呭瓨鍧椾腑鎵鏈夊垎閰嶅崟鍏冮兘涓鴻嚜鐢辯姸鎬侊紝榪欐槸鍥犱負絎?嬈″垎閰嶇殑鍐呭瓨鍧楋紙鍒嗛厤鍗曞厓涓暟涓簄InitSize錛夊彲鑳借縐誨埌閾捐〃鐨勫悗闈紝鐢氳嚦鍙兘鍦ㄧЩ鍒伴摼琛ㄥ悗闈㈠悗錛屽洜涓烘煇涓椂闂村叾鎵鏈夊崟鍏冮兘澶勪簬鑷敱鐘舵佽岃鏁翠釜榪斿洖緇欒繘紼嬪爢銆傚嵆鍦ㄥ洖鏀跺垎閰嶅崟鍏冩椂錛屾棤娉曞垽瀹氭煇涓唴瀛樺潡涓殑鍒嗛厤鍗曞厓涓暟鍒板簳鏄痭InitSize榪樻槸nGrowSize錛屼篃灝辨棤娉曢氳繃姣旇緝nFree涓巒InitSize鎴杗GrowSize鐨勫ぇ灝忔潵鍒ゆ柇涓涓唴瀛樺潡鐨勬墍鏈夊垎閰嶅崟鍏冩槸鍚﹂兘涓鴻嚜鐢辯姸鎬併?/p> <p>浠ヤ笂闈㈠垎閰嶅悗鐨勫唴瀛樻睜鐘舵佷綔涓轟緥瀛愶紝鍋囪榪欐椂絎?涓唴瀛樺潡涓殑鏈鍚庝竴涓崟鍏冮渶瑕佸洖鏀訛紙宸茶鍒嗛厤錛屽亣璁懼叾緙栧彿涓簃錛宲Free鎸囬拡鎸囧悜瀹冿級錛屽鍥?-5鎵紺恒?/p> <p>涓嶉毦鍙戠幇錛岃繖鏃秐First鐨勫肩敱鍘熸潵鐨?鍙樹負m銆傚嵆姝ゅ唴瀛樺潡涓嬩竴涓鍒嗛厤鐨勫崟鍏冩槸m緙栧彿鐨勫崟鍏冿紝鑰屼笉鏄?緙栧彿鐨勫崟鍏冿紙鏈鍏堝垎閰嶇殑鏄渶鏂板洖鏀剁殑鍗曞厓錛屼粠榪欎竴鐐圭湅錛岃繖涓繃紼嬩笌鏍堢殑鍘熺悊綾諱技錛屽嵆鍏堣繘鍚庡嚭銆傚彧涓嶈繃榪欓噷鐨?榪?鎰忓懗鐫"鍥炴敹"錛岃?鍑?鍒欐剰鍛崇潃"鍒嗛厤"錛夈傜浉搴斿湴錛宮鐨?涓嬩竴涓嚜鐢卞崟鍏?鏍囪涓?錛屽嵆鍐呭瓨鍧楀師鏉ョ殑"涓嬩竴涓皢琚垎閰嶅嚭鍘葷殑鍗曞厓"錛岃繖涔熻〃鏄庢渶榪戝洖鏀剁殑鍒嗛厤鍗曞厓琚彃鍒頒簡鍐呭瓨鍧楃殑"鑷敱鍒嗛厤鍗曞厓閾捐〃"鐨勫ご閮ㄣ傚綋鐒訛紝nFree閫掑1銆?/p> <br><a name=N1028B><strong>鍥?-5 鍒嗛厤鍚庣殑鍐呭瓨姹犵姸鎬?/strong></a><br><img border=0 alt="鍥?-5 鍒嗛厤鍚庣殑鍐呭瓨姹犵姸鎬? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_5.gif" width=458 height=328> <br> <p>澶勭悊鑷斥懃澶勪箣鍓嶏紝鍏剁姸鎬佸鍥?-6鎵紺恒?/p> <br><a name=N102A0><strong>鍥?-6 澶勭悊鑷斥懃澶勪箣鍓嶇殑鍐呭瓨姹犵姸鎬?/strong></a><br><img border=0 alt="鍥?-6 澶勭悊鑷斥懃澶勪箣鍓嶇殑鍐呭瓨姹犵姸鎬? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_6.gif" width=535 height=365> <br> <p>榪欓噷闇瑕佹敞鎰忕殑鏄紝铏界劧pFree琚?鍥炴敹"錛屼絾鏄痯Free浠嶇劧鎸囧悜m緙栧彿鐨勫崟鍏冿紝榪欎釜鍗曞厓鍦ㄥ洖鏀惰繃紼嬩腑錛屽叾澶翠袱涓瓧鑺傝瑕嗗啓錛屼絾鍏朵粬閮ㄥ垎鐨勫唴瀹瑰茍娌℃湁鏀瑰彉銆傝屼笖浠庢暣涓繘紼嬬殑鍐呭瓨浣跨敤瑙掑害鏉ョ湅錛岃繖涓猰緙栧彿鐨勫崟鍏冪殑鐘舵佷粛鐒舵槸"鏈夋晥鐨?銆傚洜涓鴻繖閲岀殑"鍥炴敹"鍙槸鍥炴敹緇欎簡鍐呭瓨姹狅紝鑰屽茍娌℃湁鍥炴敹緇欒繘紼嬪爢錛屽洜姝ょ▼搴忎粛鐒跺彲浠ラ氳繃pFree璁塊棶姝ゅ崟鍏冦備絾鏄繖鏄竴涓緢鍗遍櫓鐨勬搷浣滐紝鍥犱負棣栧厛璇ュ崟鍏冨湪鍥炴敹榪囩▼涓ご涓や釜瀛楄妭宸茶瑕嗗啓錛屽茍涓旇鍗曞厓鍙兘寰堝揩灝變細琚唴瀛樻睜閲嶆柊鍒嗛厤銆傚洜姝ゅ洖鏀跺悗閫氳繃pFree鎸囬拡瀵硅繖涓崟鍏冪殑璁塊棶閮芥槸閿欒鐨勶紝璇繪搷浣滀細璇誨埌閿欒鐨勬暟鎹紝鍐欐搷浣滃垯鍙兘浼氱牬鍧忕▼搴忎腑鍏朵粬鍦版柟鐨勬暟鎹紝鍥犳闇瑕佹牸澶栧皬蹇冦?/p> <p>鎺ョ潃錛岄渶瑕佸垽鏂鍐呭瓨鍧楃殑鍐呴儴浣跨敤鎯呭喌錛屽強鍏跺湪鍐呭瓨鍧楅摼琛ㄤ腑鐨勪綅緗傚鏋滆鍐呭瓨鍧椾腑鐪佺暐鍙?……"鎵琛ㄧず鐨勫叾浠栭儴鍒嗕腑榪樻湁琚垎閰嶇殑鍗曞厓錛屽嵆nFree涔樹互nUnitSize涓嶇瓑浜巒Size銆傚洜涓烘鍐呭瓨鍧椾笉鍦ㄩ摼琛ㄥご錛屽洜姝よ繕闇瑕佸皢鍏剁Щ鍒伴摼琛ㄥご閮紝濡傚浘6-7鎵紺恒?/p> <br><a name=N102B8><strong>鍥?-7 鍥犲洖鏀跺紩璧風殑MemoryBlock縐誨姩</strong></a><br><img border=0 alt="鍥?-7 鍥犲洖鏀跺紩璧風殑MemoryBlock縐誨姩" src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_7.gif" width=508 height=333> <br> <p>濡傛灉璇ュ唴瀛樺潡涓渷鐣ュ彿"……"琛ㄧず鐨勫叾浠栭儴鍒嗕腑鍏ㄩ儴閮芥槸鑷敱鍒嗛厤鍗曞厓錛屽嵆nFree涔樹互nUnitSize絳変簬nSize銆傚洜涓烘鍐呭瓨鍧椾笉鍦ㄩ摼琛ㄥご錛屾墍浠ユ鏃墮渶瑕佸皢姝ゅ唴瀛樺潡鏁翠釜鍥炴敹緇欒繘紼嬪爢錛屽洖鏀跺悗鍐呭瓨姹犵殑緇撴瀯濡傚浘6-8鎵紺恒?/p> <br><a name=N102CD><strong>鍥?-8 鍥炴敹鍚庡唴瀛樻睜鐨勭粨鏋?/strong></a><br><img border=0 alt="鍥?-8 鍥炴敹鍚庡唴瀛樻睜鐨勭粨鏋? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_8.gif" width=322 height=346> <br> <p>涓涓唴瀛樺潡鍦ㄧ敵璇峰悗浼氬垵濮嬪寲錛屼富瑕佹槸涓轟簡寤虹珛鏈鍒濈殑鑷敱鍒嗛厤鍗曞厓閾捐〃錛屼笅闈㈡槸鍏惰緇嗕唬鐮侊細</p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>MemoryBlock::MemoryBlock (USHORT nTypes, USHORT nUnitSize) : nSize (nTypes * nUnitSize), nFree (nTypes - 1), 鈶? nFirst (1), 鈶? pNext (0) { char * pData = aData; 鈶? for (USHORT i = 1; i < nTypes; i++) 鈶? { *reinterpret_cast<USHORT*>(pData) = i; 鈶? pData += nUnitSize; } } </pre> </td> </tr> </tbody> </table> <br> <p>榪欓噷鍙互鐪嬪埌錛屸憼澶刾Data鐨勫垵鍊兼槸aData錛屽嵆0緙栧彿鍗曞厓銆備絾鏄憽澶勭殑寰幆涓璱鍗存槸浠?寮濮嬶紝鐒跺悗鍦ㄥ驚鐜唴閮ㄧ殑鈶㈠灝唒Data鐨勫ご涓や釜瀛楄妭鍊肩疆涓篿銆傚嵆0鍙峰崟鍏冪殑澶翠袱涓瓧鑺傚間負1錛?鍙峰崟鍏冪殑澶翠袱涓瓧鑺傚間負2錛屼竴鐩村埌錛坣Types-2錛夊彿鍗曞厓鐨勫ご涓や釜瀛楄妭鍊間負錛坣Types-1錛夈傝繖鎰忓懗鐫鍐呭瓨鍧楀垵濮嬫椂錛屽叾鑷敱鍒嗛厤鍗曞厓閾捐〃鏄粠0鍙峰紑濮嬨備緷嬈′覆鑱旓紝涓鐩村埌鍊掓暟絎?涓崟鍏冩寚鍚戞渶鍚庝竴涓崟鍏冦?/p> <p>榪橀渶瑕佹敞鎰忕殑鏄紝鍦ㄥ叾鍒濆鍖栧垪琛ㄤ腑錛宯Free鍒濆鍖栦負nTypes-1錛堣屼笉鏄痭Types錛夛紝nFirst鍒濆鍖栦負 1錛堣屼笉鏄?錛夈傝繖鏄洜涓虹1涓崟鍏冿紝鍗?緙栧彿鍗曞厓鏋勯犲畬姣曞悗錛岀珛鍒諱細琚垎閰嶃傚彟澶栨敞鎰忓埌鏈鍚庝竴涓崟鍏冨垵濮嬪茍娌℃湁璁劇疆澶翠袱涓瓧鑺傜殑鍊鹼紝鍥犱負璇ュ崟鍏冨垵濮嬪湪鏈唴瀛樺潡涓茍娌℃湁涓嬩竴涓嚜鐢卞垎閰嶅崟鍏冦備絾鏄粠涓婇潰渚嬪瓙涓彲浠ョ湅鍒幫紝褰撴渶鍚庝竴涓崟鍏冭鍒嗛厤騫跺洖鏀跺悗錛屽叾澶翠袱涓瓧鑺備細琚緗?/p> <p>鍥?-9鎵紺轟負涓涓唴瀛樺潡鍒濆鍖栧悗鐨勭姸鎬併?/p> <br><a name=N102F4><strong>鍥?-9 涓涓唴瀛樺潡鍒濆鍖栧悗鐨勭姸鎬?/strong></a><br><img border=0 alt="鍥?-9 涓涓唴瀛樺潡鍒濆鍖栧悗鐨勭姸鎬? src="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/images6/6_9.gif" width=199 height=327> <br> <p>褰撳唴瀛樻睜鏋愭瀯鏃訛紝闇瑕佸皢鍐呭瓨姹犵殑鎵鏈夊唴瀛樺潡榪斿洖緇欒繘紼嬪爢錛?/p> <br> <table border=0 cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td class=code-outline> <pre class=displaycode>MemoryPool::~MemoryPool() { MemoryBlock* pMyBlock = pBlock; while ( pMyBlock ) { …… } } </pre> </td> </tr> </tbody> </table> <br> <p><a name=N10310><span id="hvzpftn" class=smalltitle>6.2.4 浣跨敤鏂規硶</span></a></p> <p>鍒嗘瀽鍐呭瓨姹犵殑鍐呴儴鍘熺悊鍚庯紝鏈妭璇存槑濡備綍浣跨敤瀹冦備粠涓婇潰鐨勫垎鏋愬彲浠ョ湅鍒幫紝璇ュ唴瀛樻睜涓昏鏈変袱涓澶栨帴鍙e嚱鏁幫紝鍗矨lloc鍜?Free銆侫lloc榪斿洖鎵鐢寵鐨勫垎閰嶅崟鍏冿紙鍥哄畾澶у皬鍐呭瓨錛夛紝Free鍒欏洖鏀朵紶鍏ョ殑鎸囬拡浠h〃鐨勫垎閰嶅崟鍏冪殑鍐呭瓨緇欏唴瀛樻睜銆傚垎閰嶇殑淇℃伅鍒欓氳繃 MemoryPool鐨勬瀯閫犲嚱鏁版寚瀹氾紝鍖呮嫭鍒嗛厤鍗曞厓澶у皬銆佸唴瀛樻睜絎?嬈$敵璇風殑鍐呭瓨鍧椾腑鎵鍚垎閰嶅崟鍏冪殑涓暟錛屼互鍙婂唴瀛樻睜鍚庣畫鐢寵鐨勫唴瀛樺潡鎵鍚垎閰嶅崟鍏冪殑涓暟絳夈?/p> <p>緇間笂鎵榪幫紝褰撻渶瑕佹彁楂樻煇浜涘叧閿被瀵硅薄鐨勭敵璇鳳紡鍥炴敹鏁堢巼鏃訛紝鍙互鑰冭檻灝嗚綾繪墍鏈夌敓鎴愬璞℃墍闇鐨勭┖闂撮兘浠庢煇涓繖鏍風殑鍐呭瓨姹犱腑寮杈熴傚湪閿姣佸璞℃椂錛屽彧闇瑕佽繑鍥炵粰璇ュ唴瀛樻睜銆?涓涓被鐨勬墍鏈夊璞¢兘鍒嗛厤鍦ㄥ悓涓涓唴瀛樻睜瀵硅薄涓?榪欎竴闇姹傚緢鑷劧鐨勮璁℃柟娉曞氨鏄負榪欐牱鐨勭被澹版槑涓涓潤鎬佸唴瀛樻睜瀵硅薄錛屽悓鏃朵負浜嗚鍏舵墍鏈夊璞¢兘浠庤繖涓唴瀛樻睜涓紑杈熷唴瀛橈紝鑰屼笉鏄己鐪佺殑浠庤繘紼嬪爢涓幏寰楋紝闇瑕佷負璇ョ被閲嶈澆涓涓猲ew榪愮畻絎︺傚洜涓虹浉搴斿湴錛屽洖鏀朵篃鏄潰鍚戝唴瀛樻睜錛岃屼笉鏄繘紼嬬殑緙虹渷鍫嗭紝榪橀渶瑕侀噸杞戒竴涓猟elete榪愮畻絎︺傚湪new榪愮畻絎︿腑鐢ㄥ唴瀛樻睜鐨凙lloc鍑芥暟婊¤凍鎵鏈夎綾誨璞$殑鍐呭瓨璇鋒眰錛岃岄攢姣佹煇瀵硅薄鍒欏彲浠ラ氳繃鍦?delete榪愮畻絎︿腑璋冪敤鍐呭瓨姹犵殑Free瀹屾垚銆?/p> <p><a name=N1031C><span id="hvzpftn" class=smalltitle>6.2.5 鎬ц兘姣旇緝</span></a></p> <p>涓轟簡嫻嬭瘯鍒╃敤鍐呭瓨姹犲悗鐨勬晥鏋滐紝閫氳繃涓涓緢灝忕殑嫻嬭瘯紼嬪簭鍙互鍙戠幇閲囩敤鍐呭瓨姹犳満鍒跺悗鑰楁椂涓?97 ms銆傝屾病鏈夐噰鐢ㄥ唴瀛樻睜鏈哄埗鍒欒楁椂625 ms錛岄熷害鎻愰珮浜?2.48%銆傞熷害鎻愰珮鐨勫師鍥犲彲浠ュ綊緇撲負鍑犵偣錛屽叾涓錛岄櫎浜嗗伓灝旂殑鍐呭瓨鐢寵鍜岄攢姣佷細瀵艱嚧浠庤繘紼嬪爢涓垎閰嶅拰閿姣佸唴瀛樺潡澶栵紝緇濆ぇ澶氭暟鐨勫唴瀛樼敵璇峰拰閿姣侀兘鐢卞唴瀛樻睜鍦ㄥ凡緇忕敵璇峰埌鐨勫唴瀛樺潡涓繘琛岋紝鑰屾病鏈夌洿鎺ヤ笌榪涚▼鍫嗘墦浜ら亾錛岃岀洿鎺ヤ笌榪涚▼鍫嗘墦浜ら亾鏄緢鑰楁椂鐨勬搷浣滐紱鍏朵簩錛岃繖鏄崟綰跨▼鐜鐨勫唴瀛樻睜錛屽彲浠ョ湅鍒板唴瀛樻睜鐨凙lloc鍜孎ree鎿嶄綔涓茍娌℃湁鍔犵嚎紼嬩繚鎶ゆ帾鏂姐傚洜姝ゅ鏋滅被A鐢ㄥ埌璇ュ唴瀛樻睜錛屽垯鎵鏈夌被A瀵硅薄鐨勫垱寤哄拰閿姣侀兘蹇呴』鍙戠敓鍦ㄥ悓涓涓嚎紼嬩腑銆備絾濡傛灉綾籄 鐢ㄥ埌鍐呭瓨姹狅紝綾籅涔熺敤鍒板唴瀛樻睜錛岄偅涔堢被A鐨勪嬌鐢ㄧ嚎紼嬪彲浠ヤ笉蹇呬笌綾籅鐨勪嬌鐢ㄧ嚎紼嬫槸鍚屼竴涓嚎紼嬨?/p> <p>鍙﹀錛屽湪絎?绔犱腑宸茬粡璁ㄨ榪囷紝鍥犱負鍐呭瓨姹犳妧鏈嬌寰楀悓綾誨瀷鐨勫璞″垎甯冨湪鐩擱偦鐨勫唴瀛樺尯鍩燂紝鑰岀▼搴忎細緇忓父瀵瑰悓涓綾誨瀷鐨勫璞¤繘琛岄亶鍘嗘搷浣溿傚洜姝ゅ湪紼嬪簭榪愯榪囩▼涓彂鐢熺殑緙洪〉搴旇浼氱浉搴斿皯涓浜涳紝浣嗚繖涓竴鑸彧鑳藉湪鐪熷疄鐨勫鏉傚簲鐢ㄧ幆澧冧腑榪涜楠岃瘉銆?/p> <div id="hvzpftn" class=ibm-alternate-rule></div> <p class="ibm-ind-link ibm-back-to-top"><a class=ibm-anchor-up-link ><u><font color=#0066cc>鍥為〉棣?/font></u></a></p> <p><a name=N10328><span id="hvzpftn" class=atitle>6.3 鏈珷灝忕粨</span></a></p> <p>鍐呭瓨鐨勭敵璇峰拰閲婃斁瀵逛竴涓簲鐢ㄧ▼搴忕殑鏁翠綋鎬ц兘褰卞搷鏋佸ぇ錛岀敋鑷沖湪寰堝鏃跺欐垚涓烘煇涓簲鐢ㄧ▼搴忕殑鐡墮銆傛秷闄ゅ唴瀛樼敵璇峰拰閲婃斁寮曡搗鐨勭摱棰堢殑鏂規硶寰寰鏄拡瀵瑰唴瀛樹嬌鐢ㄧ殑瀹為檯鎯呭喌鎻愪緵涓涓悎閫傜殑鍐呭瓨姹犮傚唴瀛樻睜涔嬫墍浠ヨ兘澶熸彁楂樻ц兘錛屼富瑕佹槸鍥犱負瀹冭兘澶熷埄鐢ㄥ簲鐢ㄧ▼搴忕殑瀹為檯鍐呭瓨浣跨敤鍦烘櫙涓殑鏌愪簺"鐗規?銆傛瘮濡傛煇浜涘唴瀛樼敵璇蜂笌閲婃斁鑲畾鍙戠敓鍦ㄤ竴涓嚎紼嬩腑錛屾煇縐嶇被鍨嬬殑瀵硅薄鐢熸垚鍜岄攢姣佷笌搴旂敤紼嬪簭涓殑鍏朵粬綾誨瀷瀵硅薄瑕侀綣佸緱澶氾紝絳夌瓑銆傞拡瀵硅繖浜涚壒鎬э紝鍙互涓鴻繖浜涚壒孌婄殑鍐呭瓨浣跨敤鍦烘櫙鎻愪緵閲忚韓瀹氬仛鐨勫唴瀛樻睜銆傝繖鏍瘋兘澶熸秷闄ょ郴緇熸彁渚涚殑緙虹渷鍐呭瓨鏈哄埗涓紝瀵逛簬璇ュ疄闄呭簲鐢ㄥ満鏅腑鐨勪笉蹇呰鐨勬搷浣滐紝浠庤屾彁鍗囧簲鐢ㄧ▼搴忕殑鏁翠綋鎬ц兘銆?/p> <img src ="http://m.shnenglu.com/guojingjia2006/aggbug/143473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guojingjia2006/" target="_blank">灝忔灉瀛?/a> 2011-04-05 20:18 <a href="http://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143473.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>c++ 鍐呭瓨娉勯湶(杞?http://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143472.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 05 Apr 2011 12:11:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143472.htmlhttp://m.shnenglu.com/guojingjia2006/comments/143472.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2011/04/05/143472.html#Feedback2http://m.shnenglu.com/guojingjia2006/comments/commentRss/143472.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/143472.html 鍐呭瓨娉勯湶鐩鎬俊瀵笴++紼嬪簭鍛樻潵璇撮兘涓嶉檶鐢熴傝В鍐沖唴瀛樻硠闇茬殑鏂規澶氱澶氭牱錛屽ぇ閮ㄥ垎鏂規浠ヨ拷韙嫻嬩負涓伙紝榪欑鏂規硶瀹炵幇璧鋒潵瀹規槗錛屼嬌鐢ㄦ柟渚匡紝涔熸瘮杈冨畨鍏ㄣ?/p>

         棣栧厛鎴戜滑瑕佺‘瀹氳繖涓ā鍧楃殑涓昏鍔熻兘錛?/p>

  1. 鑳借拷韙唴瀛樼殑鍒嗛厤鍜岄噴鏀捐繃紼嬨?/li>
  2. 瑕佽兘鏄劇ず鍐呭瓨鍒嗛厤鐨勭浉鍏充俊鎭紝姣斿鍐呭瓨鍧楀ぇ灝忥紝浠g爜鎵鍦ㄦ枃浠舵墍鍦ㄨ絳夈?/li>
  3. 鍦ㄥ彂鐜板唴瀛樻硠闇叉椂鍙婃椂緇欏嚭鐩稿叧淇℃伅銆?/li>
  4. 鑳芥紜鐞嗕竴浜涘紓甯告儏鍐碉紝姣斿鍐呭瓨涓嶈凍錛屽璞″垵濮嬪寲澶辮觸絳夌瓑銆?/li>
  5. 鏄嚎紼嬪畨鍏ㄧ殑銆俒*榪欎釜榪樻病鏈夊疄鐜癩

        鏈変簡涓浜涘熀鏈姛鑳介渶姹傦紝鎴戜滑闇瑕佽冭檻姣忕鍔熻兘鎬庝箞鍘誨疄鐜般傞鍏堬紝鎴戜滑鍙互閫氳繃閲嶈澆鐨勬柟寮忔潵榪借釜new,delete.malloc鍜宖ree錛孋++緇欐垜鎻愪緵浜嗚繖鏍風殑鐗規с傚洜涓烘湰鏂囦富瑕侀拡瀵笴++錛屾墍浠ヤ富瑕佽閲嶈澆new,delete鐨勬柟娉曪紝malloc鍜宖ree鐨勯噸杞藉疄鐜頒簬姝ょ被浼鹼紝鏈緇堢増鏈殑紼嬪簭涓篃瀹炵幇浜唌alloc鍜宖ree鐨勯噸杞姐?a id=more>

1.閲嶈澆new鍜宒elete

        棣栧厛鎴戜滑瑕佷簡瑙d竴涓媙ew鍜宒elete鏄庝箞宸ヤ綔鐨勩侰++涓殑鎿嶄綔絎︽渶緇堥兘浼氳杞崲鎴愬嚱鏁板艦寮忥紝渚嬪"new int"浼氬彉鎴?opetaor new(sizeof(int))"錛岃?new double[10]"浼氬彉鎴?operator new(sizeof(double)*10)"錛屽悓鏍?#8220;delete p”灝卞彉鎴愪簡"operator delete(p)"銆傚彟澶栦竴涓渶瑕佺壒鍒敞鎰忕殑鍦版柟鏄紝new瀵逛簬鐢ㄦ埛瀹氫箟鐨勬暟鎹被鍨嬶紙鍗充綘鐨勮嚜瀹氫箟綾伙級浼氳嚜鍔ㄨ皟鐢ㄨ綾誨瀷鐨勬瀯閫犲嚱鏁幫紝濡傛灉鏋勯犲嚱鏁版病鏈夋姏鍑哄紓甯革紝鍒欐紜垎閰嶏紝鍚﹀垯浼氫腑鏂垎閰嶆搷浣滐紝灝嗗紓甯鎬紶閫掔粰鐢ㄦ埛銆傞粯璁ゆ儏鍐典笅錛宯ew鍙互瀵硅薄鏋勯犲紓甯歌繘琛屾崟鑾楓傚彟澶栦竴涓増鏈殑new灝辨槸涓嶅甫鎹曡幏寮傚父鍔熻兘鐨勭殑浜嗭紝鎵浠++緋葷粺鎻愪緵鐨刵ew鍜宒elete鏈夛細

1
2
3
4
5
6
7
8
9
void* operator new(size_t size)throw(std::bad_alloc);
void* operator new[](size_t size) throw(std::bad_alloc);
void* operator new(size_t,std::nothrow_t&)throw();
void* operator new[](size_t,std::nothrow_t&)throw();
 
void  operator delete(void* pointer);
void  operator delete[](void* pointer);
void  operator delete(void* pointer,std::nothrow_t&);
void  operator delete[](void* pointer,std::nothrow_t&);<br>

        鍏朵腑錛宯othrow_t鏄竴涓┖緇撴瀯浣?#8220;struct nothrow_t{}"錛屽畠鐨勪竴涓疄渚嬪氨鏄痭othrow錛孋++鐢ㄥ畠鏉ュ尯鍒嗗彲浠ユ崟鑾峰紓甯哥殑new鍜屼笉鍙崟鑾峰紓甯哥殑new銆傛垜浠笉鑳界洿鎺ヤ慨鏀瑰唴閮ㄥ嚱鏁扮殑琛屼負錛屼絾鏄垜浠彲浠ラ噸杞藉畠浠備負浜嗗疄鐜版彁渚涘唴瀛樺垎閰嶄俊鎭殑鍔熻兘錛屾垜浠粰閲嶈澆鐨勫嚱鏁板姞涓婂嚑涓弬鏁般傚緱鍒頒互涓嬪嚱鏁幫細

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* operator new(size_t size);
void* operator new[](size_t size);
void* operator new(size_t,std::nothrow_t&)throw();
void* operator new[](size_t,std::nothrow_t&)throw();
void* operator new(size_t size,const char* file,const char* func,const int line)throw(std::bad_alloc);
void* operator new[](size_t size,const char* file,const char* func,const int line) throw(std::bad_alloc);
void* operator delete(void* pointer);
void* operator delete[](void* pointer);
/*******Placement Delete********/
void  operator delete(void* pointer,const char* file,const char* func,const int line);
void  operator delete[](void* pointer,const char* file,const char* func,const int line);
void  operator delete(void* pointer,std::nothrow_t&);
void  operator delete[](void* pointer,std::nothrow_t&);
/*******************************/

         涓棿鐨勫嚑涓嚱鏁幫紝灝辨槸鎴戜滑涓昏闇瑕侀噸杞界殑鍑芥暟錛屾ā鍧楃殑澶ч儴鍒嗗伐浣滀篃閮界敱鐫鍑犱釜鍑芥暟瀹屾垚銆傝繖浜涘嚱鏁板弬鏁頒腑錛宖ile琛ㄧず鍒嗛厤浠g爜鎵鍦ㄧ殑鏂囦歡鍚嶏紝func琛ㄧず浠g爜鎵鍦ㄧ殑鍑芥暟鍚嶏紝line琛ㄧず浠g爜琛屽彿銆傝繖鍑犱釜鍙傛暟淇℃伅鎴戜滑鍙互閫氳繃緙栬瘧鍣ㄩ瀹氫箟濂界殑鍑犱釜瀹忔潵鑾峰緱錛歘_FILE__,__FUNCTION__,__LINE__銆備篃灝辨槸璇村彲浠ュ皢"new ..."鏇挎崲鎴?new(__FILE__,__FUNCTION__,__LINE__) ..."錛屾渶緇堟垚涓?operator new(sizeof(...),__FILE__,__FUNCTION__,__LINE__)"鐨勫艦寮忥紝涔熷氨杈懼埌浜嗘垜浠殑鐩殑銆傚叧浜?placement delete灝嗗湪涓嬮潰璇︾粏瑙i噴銆?/p>

2.絀洪棿鍒嗛厤

        鎺ヤ笅鏉ユ垜浠鑰冭檻鍐呭瓨鍒嗛厤淇℃伅鐨勭粍緇囬棶棰樹簡銆傛垜浠厛鏉ヤ簡瑙d竴涓嬬紪璇戝櫒鏄庝箞緇勭粐鐨勩傚湪澶ч儴鍒嗙紪璇戝櫒涓紝new鎵鍒嗛厤鐨勭┖闂撮兘瑕佸ぇ浜庡疄闄呯敵璇風殑絀洪棿錛屽ぇ鍑烘潵鐨勯儴鍒嗗氨鏄紪璇戝櫒瀹氫箟鐨勫唴瀛樺潡鐨勪俊鎭紝鍖呮嫭浜嗗唴瀛樺潡鐨勫ぇ灝忚繕鏈変竴浜涘叾浠栦俊鎭傚涓嬪浘鎵紺猴細

        鎴戜滑鎶婂寘鍚唴瀛樺垎閰嶄俊鎭殑閮ㄥ垎鍙仛cookie鏁版嵁銆備負浜嗘柟渚匡紝鎴戜滑鎶奵ookie鏁版嵁鏀懼湪鍒嗛厤鐨勫唴瀛樼殑璧峰浣嶇疆錛屼箣鍚庣揣鎺ユ湁鏁堟暟鎹尯銆傛垜浠繕闇瑕佹妸榪斿洖緇欒皟鐢ㄨ呯殑鎸囬拡鍜宯ew鍒嗛厤鐨勬暟鎹尯鑱旂郴璧鋒潵錛屽師鏈兂鐢ㄦц兘姣旇緝濂界殑STL鐨刴ap鏁版嵁緇撴瀯鏉ュ偍瀛樿繖浜涙暟鎹紝浣嗘槸map鍐呴儴鍚屾牱涔熶嬌鐢╪ew鏉ュ垎閰嶅唴瀛橈紝鎵浠ュ鏋滅洿鎺ヤ嬌鐢╩ap鏉ュ偍瀛橈紝灝變細闄峰叆姝誨驚鐜腑銆傛墍浠ヨ繖閲屾垜浠繀欏昏嚜宸辯幇瀹炰竴涓暟鎹粨鏋勩傛垜浠彲浠ュ榪斿洖緇欒皟鐢ㄨ呯殑鍦板潃榪涜Hash錛屽緱鍒癶ash 琛ㄤ腑鐨勫湴鍧錛屽叿鏈夌浉鍚孒ash鍊肩殑鏁版嵁鎴戜滑鐢ㄤ竴涓崟鍚戦摼琛ㄨ繛鎺ヨ搗鏉ャ傛渶緇堢殑鏁版嵁緇撴瀯濡備笅鍥炬墍紺猴細

2.1.鏋勯犲嚱鏁頒腑鐨勫紓甯?/strong>

        鍙﹀涓涓繀欏昏娉ㄦ剰鐨勪竴鐐規槸錛宯ew鎿嶄綔絎︿細鍏堝垎閰嶇┖闂寸劧鍚庤皟鐢ㄧ敤鎴瘋嚜瀹氫箟綾誨瀷鐨勬瀯閫犲嚱鏁幫紝濡傛灉鏋勯犲嚱鏁版姏鍑哄紓甯革紝闇瑕佺敤鎴鋒墜鍔ㄩ噴鏀懼凡鍒嗛厤鐨勫唴瀛樸傞棶棰樺湪浜庨噴鏀捐繖鏍風殑鍐呭瓨涓嶈兘鐢ㄤ竴鑸殑delete鎿嶄綔絎︼紝鍙互鐢ㄤ竴涓緥瀛愭潵璇存槑錛?/p>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdexcept>
 
void* operator new(size_t size, int line) {
    printf("Allocate %u bytes on line %d\\n", size, line);
    return operator new(size);
}
 
class UserClass {
public:
    UserClass(int n)throw(){
        if(n<=0){
             throw std::runtime_error("n must be positive");
        }
    }
};
 
int main(){
    try{
        UserClass* myobj=new(__LINE__) UserClass(-10);
        delete myobj; //doesn't work if placement was not defined
    } catch(const std::runtime_error& e) {
        fprintf(stderr,"Exception: %s\n",e.what());
    }
    return 0;
}<br>

        榪欓噷錛岃櫧鐒跺湪new榪囧悗璇曞浘浣跨敤delete閲婃斁宸茬粡鍒嗛厤鐨勫唴瀛橈紝浣嗘槸瀹為檯涓婁笉浼氶噴鏀俱備篃璁鎬綘鐨勭紪璇戝櫒浼氱粰鍑鴻繖鏍蜂竴鏉℃秷鎭細

        “no matching operator delete found”

        涓轟簡姝g‘澶勭悊榪欑鎯呭喌錛屽茍緇欑敤鎴鋒彁渚涚浉鍏崇殑淇℃伅錛屾垜浠渶瑕佸畾涔塸lacement delete鎿嶄綔絎︺俻lacement delete鏄疌++98鏍囧噯涓墠鏈夌殑涓涓壒鎬э紝鎵浠ュ浜庢煇浜涜佺殑緙栬瘧鍣紙澶ц嚧鍙互璁や負鏄寚閭d簺98騫翠互鍓嶇紪鍐欑殑緙栬瘧鍣級涓嶆敮鎸佽繖涓壒鎬с傝繖闇瑕佸湪妯″潡涓坊鍔犲畯瀹氫箟璁╃敤鎴峰彲浠ュ叧闂璸lacement delete鐨勫畾涔夛紝浠ヤ究妯″潡鑳藉湪杈冭佺殑緙栬瘧鍣ㄤ笂緙栬瘧銆備互涓嬪氨鏄渶瑕佸畾涔夌殑placement delete鎿嶄綔絎︼細

1
2
3
4
void  operator delete(void* pointer,const char* file,const char* func,const int line);
void  operator delete[](void* pointer,const char* file,const char* func,const int line);
void  operator delete(void* pointer,std::nothrow_t&);
void  operator delete[](void* pointer,std::nothrow_t&);<br>

3.媯鏌ュ唴瀛樻硠闇?/strong>

        鏈変簡涓婇潰鐨勫疄鐜幫紝鎴戜滑鍙互鏂逛究鐨勬墜鍔ㄦ嫻嬪唴瀛樻硠闇層傞氳繃涓涓嚱鏁版潵瀹炵幇錛屽畠浼氭绱㈡暣涓猦ash琛紝濡傛灉琛ㄤ笉涓虹┖鍒欏瓨鍦ㄥ唴瀛樻硠闇層?/p>

        涓轟簡杈懼埌鍦ㄦ渶鍚庣▼搴忛鍑烘椂媯鏌ュ唴瀛樻硠闇茬殑鐩殑錛屾垜浠渶瑕佸湪鎵鏈夊璞¤皟鐢ㄦ瀽鏋勫嚱鏁板悗榪涜鍐呭瓨娉勯湶媯嫻嬶紝榪欐槸鍥犱負鏌愪簺鐢ㄦ埛綾誨瀷鍦ㄦ瀯閫犲嚱鏁伴噷璋冪敤new鑰屽湪鏋愭瀯鍑芥暟閲岃皟鐢╠elete銆傝繖鏍峰仛鑳藉ぇ澶х殑鍑忓皬璇姤鐨勬鐜囥傝屼笖鍥犱負瀵硅薄鐨勬瀽鏋勫嚱鏁扮殑璋冪敤寰寰鍦ㄤ富鍑芥暟main()鎵ц緇撴潫涔嬪悗榪涜錛屾墍浠ユ垜浠篃涓嶈兘鐩存帴鍦ㄤ富鍑芥暟閲岃繘琛屽唴瀛樻硠闇叉嫻嬨傝繖閲屾垜浠埄鐢ㄤ竴涓叏灞瀵硅薄鏉ュ疄鐜拌繖縐嶆嫻嬨傞鍏堟垜浠畾涔変竴涓被錛?/p>

1
2
3
4
5
6
7
8
9
10
11
class MemCheck{
    public:
        MemCheck(){
            memset(pTable,0,sizeof(mc_block_node_t*) * MC_HASHTABLESIZE);
        }
        ~MemCheck(){
            if(mc_checkmem()){
                abort();
            }
        }
};

        榪欓噷鐨勬瀯閫犲嚱鏁板垵濮嬪寲Hash琛ㄣ傛瀽鏋勫嚱鏁版嫻嬪唴瀛樻硠闇層傜劧鍚庡畾涔変竴涓狹emCheck鐨勫叏灞闈欐佸璞★紝榪欐牱褰撶▼搴忚繍琛屼箣鍓嶄細鍒濆鍖杊ash琛紝紼嬪簭閫鍑烘椂媯嫻嬪唴瀛樻硠闇層傚彲鏄棶棰樺張鏉ヤ簡錛屽鏋滀竴涓▼搴忎腑鏈夊涓叏灞闈欐佸璞′細鎬庢牱錛熶笉騫哥殑鏄紝瀵逛簬鍏ㄥ眬闈欐佸璞$殑鏋勯犻『搴忓拰鏋愭瀯欏哄簭鏄疌++鏍囧噯涓殑涓涓湭瀹氫箟闂錛屼篃灝辨槸璇達紝榪欎釜欏哄簭鍙栧喅浜庣紪璇戝櫒鐨勫叿浣撳疄鐜般傝冭檻錛岀粷澶у鏁板鉤鍙頒嬌鐢╒C鍜孏CC緙栬瘧鍣紝鎴戜滑鍙互閽堝榪欎袱縐嶇紪璇戝櫒鏉ユ帶鍒跺叏灞瀵硅薄鐨勬瀯閫犲拰瑙f瀽欏哄簭銆?/p>

1
2
3
4
5
6
7
8
9
#ifdef _MSC_VER
#pragma init_seg(lib)
#endif
 
static MemCheck mc_autocheck_object
#ifdef __GNUC__
__attribute__((init_priority (101)))
#endif
;

        榪欓噷鐨勫畯瀹氫箟閮ㄥ垎閮芥槸緙栬瘧鍣ㄧ殑閫夐」銆?/p>

]]>
PE瀛︿範鎬葷粨http://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 12 Oct 2010 09:22:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129621.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129621.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129621.html#include "windows.h"#include <iostream>using namespace std;#define NTSI...  闃呰鍏ㄦ枃

]]>
__type_traits(杞?http://m.shnenglu.com/guojingjia2006/archive/2010/10/11/129405.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Mon, 11 Oct 2010 01:24:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/11/129405.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129405.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/11/129405.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129405.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129405.html鍦⊿TL涓負浜嗘彁渚涢氱敤鐨勬搷浣滆屽張涓嶆崯澶辨晥鐜囷紝鎴戜滑鐢ㄥ埌浜嗕竴縐嶇壒孌婄殑鎶宸э紝鍙玹raits緙栫▼鎶宸с傚叿浣撶殑鏉ヨ錛宼raits灝辨槸 閫氳繃瀹氫箟涓浜涚粨鏋勪綋鎴栫被錛屽茍鍒╃敤妯℃澘綾葷壒鍖栧拰鍋忕壒鍖栫殑鑳藉姏錛岀粰綾誨瀷璧嬩簣涓浜涚壒鎬э紝榪欎簺鐗規ф牴鎹被鍨嬬殑涓嶅悓鑰屽紓銆傚湪紼嬪簭璁捐涓彲浠ヤ嬌鐢ㄨ繖浜泃raits鏉ュ垽 鏂竴涓被鍨嬬殑涓浜涚壒鎬э紝寮曞彂C++鐨勫嚱鏁伴噸杞芥満鍒訛紝瀹炵幇鍚屼竴縐嶆搷浣滃洜綾誨瀷涓嶅悓鑰屽紓鐨勬晥鏋溿倀raits鐨勭紪紼嬫妧宸ф瀬搴﹀譏琛ヤ簡C++璇█鐨勪笉瓚?銆?/strong>


涓句緥錛?br>
鐜板湪瀹氫箟涓涓猒_type_traits鍙互鑾峰緱綾誨瀷鐨勫涓嬪睘鎬э細
1. 鏄惁瀛樺湪non-trivial default constructor
2. 鏄惁瀛樺湪non-trivial copy constructor
3. 鏄惁瀛樺湪non-trivial assignment operator
4. 鏄惁瀛樺湪non-trivial destructor

struct __true_type {
};
struct __false_type {
};

template <class _Tp>
struct __type_traits {

   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
};


闂錛氫負浠涔堟妸瀵硅薄鐨勬墍鏈夌殑灞炴ч兘瀹氫箟涓篲_false_type錛?br> 榪欐牱鏄噰鐢ㄦ渶淇濆畧鐨勫仛娉曪紝鍏堟妸鎵鏈夌殑瀵硅薄灞炴ч兘璁劇疆涓篲_false_type錛岀劧鍚庡湪閽堝姣忎釜鍩烘湰鏁版嵁綾誨瀷璁捐鐗瑰寲鐨刜_type_traits錛屽氨鍙互杈懼埌棰勬湡鐨勭洰鐨勶紝濡傚彲浠ュ畾涔塤_type_traits<int>濡備笅錛?br>
template <>
struct __type_traits<int> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
};

template <>
struct __type_traits<char> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
};

    ......

    ......


鍏朵粬鍩烘湰綾誨瀷鐨則raits涔熷彲浠ユ湁鐩稿簲鐨勫畾涔?br>
__type_traits鐨勫亸鐗瑰寲鐗堟湰
template <class _Tp>
struct __type_traits<_Tp*> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

鎴戜滑鍙互鑷畾涔塤_type_traits鐨勭壒鍖栫増鏈?br> 姣斿瀵逛笌鑷畾涔夌殑Shape綾誨瀷錛屾垜浠彲浠ヨ繖鏍峰畾涔塤_type_traits<Shape>
struct __type_traits<Shape> {
   typedef __false_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

濡傛灉緙栬瘧鍣ㄥ鍘夊錛屾垜浠敋鑷沖彲浠ヤ笉鐢ㄨ嚜宸卞幓瀹氫箟鐗瑰寲鐨刜_type_traits錛岀紪璇戝櫒灝辮兘澶熷府鎴戜滑鎼炲畾錛氾級

濡備綍浣跨敤鍛紵

鍋囪鐜板湪鐢ㄤ釜妯℃澘鍑芥暟fun闇瑕佹牴鎹被鍨婽鏄惁鏈塶on-trivial constructor鏉ヨ繘琛屼笉鍚岀殑鎿嶄綔錛屽彲浠ヨ繖鏍鋒潵瀹炵幇錛?br>
template<class T>
void fun()
{
     typedef typename __type_traits<T>::has_trivial_constructor _Trivial_constructor;
    __fun(_Trivial_constructor()); // 鏍規嵁寰楀埌鐨刜Trivial_constructor鏉ヨ皟鐢ㄧ浉搴旂殑鍑芥暟
}

// 涓や釜閲嶈澆鐨勫嚱鏁?br> void _fun(_true_type)
{
cout<<"fun(_true_type)called"<<endl;
}
void _fun(_false_type)
{
cout<<"fun(_false_type) called"<<endl;
}

//嫻嬭瘯浠g爜

int main()
{
fun<char>();
fun<int>();
fun<char *>();
fun<double>();
}



]]>
Traits瀛︿範--榪唬鍣?1)http://m.shnenglu.com/guojingjia2006/archive/2010/10/09/129184.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Sat, 09 Oct 2010 05:23:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/09/129184.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129184.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/09/129184.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129184.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129184.html
鐢╰emplate瑕佹眰鍐欎竴涓ā鏉垮嚱鏁幫紝榪斿洖鍊艱姹傛槸鍙傛暟綾誨瀷錛屽垵姝ヨ璁?br>template<typename T>
class AIter{
public:
    AIter(T
* p=0):ptr(p){};
    T
* ptr;
    typedef T value_type;
    T
& operator*()const{
        
return *ptr;
    }
    T
* operator->()const{
        
return ptr;
    }
};
template
<typename T>
typename T::value_type
func(T val){
    
return *val;
}

榪欐柟娉曚竴涓己闄峰氨鏄浜庝笉鏄痗lass type鐨勭被鍨嬫棤鑳戒負鍔?姣斿鍘熺敓鎸囬拡,鍙湁class type綾誨瀷鎵嶈兘鍐呭祵綾誨瀷

鏀硅繘--妯℃澘鍋忕壒鍖?template partial specialization)
澹版槑涓涓被鍨?br>template<typename T>
struct stl_iterator_traits{
    typedef typename T::value_type value_type;
};
鍘熷厛鐨刦unc鍙互鍐欐垚榪欐牱
template<typename T>
typename stl_iterator_traits<T>::value_type
func(T val){
    return *val;
}
榪欐牱榪樻槸澶勭悊涓嶄簡
int* p=new int(3);
func(p);
鍘熺敓鎸囬拡綾誨瀷錛屼負鍏舵彁渚涚壒鍖栫増鏈?br>template<typename T>
struct stl_iterator_traits<T*>{
    typedef T value_type;
};
榪欐牱灝辮兘瀹岀編瑙e喅鍒氭墠闂

浣嗘槸瀵逛簬鎸囧悜甯告暟瀵硅薄鐨勬寚閽?br>stl_iterator_traits<const int*>::value_type
鎴戜滑甯屾湜鏆傛椂瀛樺偍涓涓彉閲忥紝浣嗘槸鎴戜滑鑾峰彇鐨勭被鍨嬫槸const int,澹版槑涓涓棤娉曡祴鍊肩殑涓存椂鍙橀噺鏃犳剰涔夛紝鎵浠ユ垜浠湪鎻愪緵涓涓壒鍖栫増鏈?br>
template<typename T>
struct stl_iterator_traits<const T*>{
    typedef T value_type;
};
iterator example:
#include <iterator>
//#using <mscorlib.dll>
#include <iostream>
#include 
<memory>
#include 
<vector>
#include 
<algorithm>
//using namespace System;
using namespace std;

template
<typename T>
class ListItem{
public:
    ListItem(T value){
        _value
=value;
        _next
=NULL;
    }
    ListItem(){
        _next
=NULL;
        _value
=0;
    }
    T value()
const{
        
return _value;
    }
    ListItem
<T>* _next;
    T _value;    
};
template
<class Item>
class ListIter:public iterator<std::forward_iterator_tag,Item>{
public:
    Item
* ptr;
    ListIter(Item
* p=0):ptr(p){};
    Item
& operator*()const{
        
return *ptr;
    }
    Item
* operator->()const{
        
return ptr;
    }
    ListIter
& operator++(){
        ptr
=ptr->_next;
        
return *this;
    }
    ListIter 
operator++(int){
        ListIter tmp
=*this;
        
++(*this);
        
return tmp;
    }
    
bool operator==(const ListIter& iter)const{
        
return ptr==iter.ptr;
    }
    
bool operator!=(const ListIter& iter)const{
        
return ptr!=iter.ptr;
    }
};
template
<typename T>
bool operator==(ListItem<T>& item,T value){
    
return item.value()==value;
}

template
<typename T>
class List{
public:
    typedef ListIter
<ListItem<T> > iterator;
    List(){
        _end
=new ListItem<T>();
        _front
=0;
    }
    
void insert_front(T value){
        ListItem
<T>* item=new ListItem<T>(value);
        
if(empty()){
            item
->_next=_end;
            _front
=item;
        }
else{
            item
->_next=_front;
            _front
=item;
        }
    };
    
bool empty(){
        
return _front==NULL;
    }
    
void insert_end(T value){
        
//ListItem<T>* item=new ListItem<T>(value);
        if(empty()){
            _front
=_end;
            _end
->_value=value;
            _end
->_next=new ListItem<T>();
            _end
=_end->_next;
        }
else{
            _end
->_value=value;
            _end
->_next=new ListItem<T>();
            _end
=_end->_next;
        }
    };
    
void display(ostream& os=cout){
        ListItem
<T>* head=_front;
        
while(head!=_end){
            cout
<<head->value()<<endl;
            head
=head->_next;
        }
    };
    ListItem
<T>* front(){
        
return _front;
    }
private:
    ListItem
<T>* _end;
    ListItem
<T>* _front;
    
long _size;
};

template
<typename T>
struct stl_iterator_traits{
    typedef typename T::value_type value_type;
};

template
<typename T>
struct stl_iterator_traits<T*>{
    typedef T value_type;
};

template
<typename T>
class AIter{
public:
    AIter(T
* p=0):ptr(p){};
    T
* ptr;
    typedef T value_type;
    T
& operator*()const{
        
return *ptr;
    }
    T
* operator->()const{
        
return ptr;
    }
};
template
<typename T>
typename stl_iterator_traits
<T>::value_type
func(T val){
    
return *val;
}
int _tmain(int argc, _TCHAR* argv[])
{
    List
<int> list;
    
for(int i=0;i<5;i++){
        list.insert_front(i);
        list.insert_end(i
+2);
    }
    list.display();
    
    
    List
<int>::iterator begin(list.front());
    List
<int>::iterator end;
    List
<int>::iterator iter;

    
//vector<int>::iterator itere;
    AIter<int> it(new int(2));
    
    iter
=find(begin,end,2);
    cout
<<iter->value()<<endl;
    
//list.insert_end(1);
    
//list.insert_end(2);
    
//list.display();
    
//list.insert_end(
    return 0;
}

鐜板湪瀵逛簬class type 榪唬鍣ˋIter,榪樻槸鍘熺敓鎸囬拡int* 鎴朿onst int*,閮借兘鑾峰彇姝g‘綾誨瀷int
stl瑙勫畾錛屾瘡涓凱浠e櫒閮借鑷繁鍐呭祵鍨嬪埆瀹氫箟鐨勬柟寮忓畾涔夊嚭鐩稿簲鍨嬪埆
(寰呯畫...)


]]>
Effective C++榪炶澆(杞?http://m.shnenglu.com/guojingjia2006/archive/2010/10/08/129008.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Fri, 08 Oct 2010 01:19:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/08/129008.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129008.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/08/129008.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129008.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129008.html闃呰鍏ㄦ枃

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲男人的天堂在线观看| 久久久久免费视频| 香蕉成人伊视频在线观看 | 国产亚洲欧美另类一区二区三区| 久久深夜福利免费观看| 亚洲尤物视频网| 亚洲午夜精品网| 亚洲欧美一区二区三区久久 | 亚洲人成7777| 亚洲精品一区二区网址| 亚洲精品视频免费在线观看| 久久成人羞羞网站| 欧美福利一区二区| 欧美视频三区在线播放| 国产精品毛片va一区二区三区 | 精品动漫3d一区二区三区| 好男人免费精品视频| 亚洲国产天堂久久综合| 一本色道久久88综合亚洲精品ⅰ | 欧美中文字幕视频在线观看| 久久久久久久综合| 欧美视频中文字幕| 国内成人精品2018免费看 | 国产日韩欧美亚洲| 亚洲激情小视频| 久久av在线看| 亚洲九九精品| 欧美在线观看你懂的| 欧美激情女人20p| 国产一在线精品一区在线观看| 亚洲人人精品| 久久久爽爽爽美女图片| 国产精品久久久久久久久| 麻豆乱码国产一区二区三区| 日韩亚洲精品在线| 久久综合久久综合九色| 国产欧美日韩在线| 亚洲特级毛片| 亚洲电影第1页| 亚洲午夜一区二区三区| 欧美va天堂va视频va在线| 国产日韩综合| 亚洲综合欧美日韩| 亚洲乱码国产乱码精品精| 久久一区二区三区国产精品| 国产精品视频一二三| 亚洲最黄网站| 亚洲欧洲在线观看| 久久综合久久久| 国内综合精品午夜久久资源| 欧美日本一区二区高清播放视频| 国产亚洲欧美一级| 亚洲国产精品成人久久综合一区| 一色屋精品亚洲香蕉网站| 国产啪精品视频| 日韩视频中午一区| 日韩午夜电影av| 久色婷婷小香蕉久久| 中日韩午夜理伦电影免费| 久久精品最新地址| 欧美福利一区| 欧美激情一区二区久久久| 亚洲美女av网站| 欧美成人精品在线视频| 亚洲第一精品影视| 久久一区精品| 久久久久久自在自线| 狠狠狠色丁香婷婷综合激情| 久久久久女教师免费一区| 亚洲一区国产| 国产日韩一区欧美| 久久色中文字幕| 久久先锋影音av| 亚洲激情av| 日韩一级成人av| 欧美午夜久久久| 久久成人人人人精品欧| 欧美专区在线观看| 亚洲高清一区二| 亚洲伦理在线观看| 国产精品久久久久久模特| 亚洲欧美日韩国产另类专区| 亚洲欧美日韩国产成人| 国产日产欧美精品| 麻豆精品91| 欧美日韩福利在线观看| 久久成年人视频| 欧美a级片一区| 亚洲已满18点击进入久久| 亚洲欧美影音先锋| 亚洲国产cao| 亚洲少妇自拍| 亚洲国产精品123| aa亚洲婷婷| 影音先锋另类| 制服丝袜亚洲播放| 在线不卡中文字幕| 夜夜爽99久久国产综合精品女不卡 | 免费看的黄色欧美网站| 午夜精品av| 亚洲电影免费| 亚洲视频一区二区| 国产在线视频欧美| 99在线精品视频| …久久精品99久久香蕉国产| 亚洲乱码日产精品bd| 黄色成人在线网址| 夜夜爽夜夜爽精品视频| 亚洲福利久久| 午夜精品一区二区三区在线视| 91久久久久| 欧美一区二区三区电影在线观看| 91久久一区二区| 久久国产毛片| 久久er精品视频| 国产精品黄视频| 日韩视频一区二区在线观看 | 亚洲毛片av在线| 性伦欧美刺激片在线观看| 一本大道久久a久久综合婷婷 | 久热精品视频在线| 国产精品久久久久久久午夜| 欧美激情女人20p| 韩国三级电影一区二区| 亚洲午夜电影| 亚洲影视在线| 国产精品都在这里| 亚洲美女诱惑| 一本色道久久综合亚洲91| 免费欧美在线视频| 欧美大尺度在线| 伊人久久av导航| 卡一卡二国产精品| 久久久精品久久久久| 亚洲国产精品精华液2区45| 久久欧美肥婆一二区| 国产精品久久久久毛片大屁完整版 | 久久亚洲一区二区| 久久女同精品一区二区| 国模 一区 二区 三区| 亚洲欧美国产视频| 欧美一区免费视频| 国产日韩欧美在线视频观看| 一区二区三区产品免费精品久久75| 99精品国产在热久久| 欧美精品久久一区二区| 亚洲老板91色精品久久| 亚洲一区二区在线播放| 国产精品实拍| 久久精品最新地址| 欧美激情偷拍| 一区二区日韩| 国产精品久久久| 亚洲欧美在线视频观看| 久久久久久网| 日韩午夜剧场| 国产美女精品视频| 久久久久综合一区二区三区| 国产一区二区三区不卡在线观看| 性做久久久久久| 美女国产精品| 亚洲精品久久久久中文字幕欢迎你| 欧美成人一区二免费视频软件| 久久一区二区三区四区五区| 国产欧美日韩激情| 亚洲欧美制服另类日韩| 麻豆国产精品777777在线 | 麻豆精品在线观看| 日韩亚洲在线| 亚洲欧美日韩久久精品 | 免费观看在线综合色| 亚洲成人资源网| 亚洲精品久久视频| 国产精品黄视频| 欧美一区在线直播| 久久精品系列| 一区二区三区你懂的| 国产一区二区久久| 欧美18av| 欧美一区二区三区在线| 亚洲国产一区二区三区a毛片| 亚洲一区二区三区视频| 国产一区二区三区久久久久久久久| 免播放器亚洲一区| 日韩亚洲国产欧美| 牛人盗摄一区二区三区视频| 亚洲一区尤物| 日韩视频中文| 1000部国产精品成人观看| 国产精品久久77777| 欧美国产成人精品| 久久精品日韩| 欧美亚洲自偷自偷| 中文一区字幕| 亚洲精品在线一区二区| 免费看成人av| 久久亚洲一区| 久久精品国产第一区二区三区最新章节| 91久久亚洲| 亚洲狠狠丁香婷婷综合久久久|