﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-浩毛的博客-随笔分类-C &amp; C++</title><link>http://www.cppblog.com/jaxe/category/11789.html</link><description>FreeBSD、Linux下高性能网络游戏服务器开发--武功高也怕菜刀</description><language>zh-cn</language><lastBuildDate>Tue, 06 Jul 2010 03:47:42 GMT</lastBuildDate><pubDate>Tue, 06 Jul 2010 03:47:42 GMT</pubDate><ttl>60</ttl><item><title>Boost.Program_options中的一个函数式编程的例子</title><link>http://www.cppblog.com/jaxe/archive/2010/07/05/119385.html</link><dc:creator>浩毛</dc:creator><author>浩毛</author><pubDate>Mon, 05 Jul 2010 15:08:00 GMT</pubDate><guid>http://www.cppblog.com/jaxe/archive/2010/07/05/119385.html</guid><wfw:comment>http://www.cppblog.com/jaxe/comments/119385.html</wfw:comment><comments>http://www.cppblog.com/jaxe/archive/2010/07/05/119385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaxe/comments/commentRss/119385.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaxe/services/trackbacks/119385.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; boost里的program_options提供程序员一种方便的命令行和配置文件进行程序选项设置的方法。<br>&nbsp;&nbsp;&nbsp; 其文档例子中有如下代码：<br>&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;boost::program_options;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明需要的选项</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">options_description&nbsp;desc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Allowed&nbsp;options</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000">desc.add_options()<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">help,h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">produce&nbsp;help&nbsp;message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">person,p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;value</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">default_value(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">world</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">who</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
<br>&nbsp;&nbsp;&nbsp; 看第4到6行，是不是感觉很怪？这种方式体现了函数式编程中最大的特点：函数是一类值，引用资料来说,<em>所谓&#8220;函数是一类值（First Class Value）&#8221;指的是函数和值是同等的概念，一个函数可以作为另外一个函数的参数，也可以作为值使用。如果函数可以作为一类值使用，那么我们就可以写出一些函数，使得这些函数接受其它函数作为参数并返回另外一个函数。比如定义了f和g两个函数，用compose(f,g)的风格就可以生成另外一个函数，使得这个函数执行f(g(x))的操作，则可称compose为高阶函数（Higher-order Function）。<br><br></em>&nbsp;&nbsp;&nbsp; program_options里的这种方式是怎么实现的呢？通过分析boost的源代码，我们自己来写个类似的实现看看：<br>&nbsp;&nbsp;&nbsp;&nbsp; test.h&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#pragma&nbsp;once<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test_easy_init<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test_easy_init(Test</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;owner):m_owner(owner){}<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test_easy_init&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;()&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name);<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test_easy_init&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;()&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id);<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_owner;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;add(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name);<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;add(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id);<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Test_easy_init&nbsp;add_some();<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">};</span></div>
<br>test.cpp<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">Test_easy_init&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;Test_easy_init::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;()&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_owner</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">add(name,id);<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">Test_easy_init&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;Test_easy_init::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;()&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name)<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_owner</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">add(name);<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">Test_easy_init&nbsp;Test::add_some()<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Test_easy_init(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test::add(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name)<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">add:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test::add(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;name,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">add:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br>使用方式：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">Test&nbsp;t1;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000">t1.add_some()<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">no&nbsp;id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);</span></div>
<br>是不是很有意思。add_some()方法返回一个Test_easy_init类的对象，Test_easy_init类重载了操作符()，操作符()方法返回Test_easy_init类对象自身的引用。。
<img src ="http://www.cppblog.com/jaxe/aggbug/119385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaxe/" target="_blank">浩毛</a> 2010-07-05 23:08 <a href="http://www.cppblog.com/jaxe/archive/2010/07/05/119385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单实用的内存池实现之二 （C实现）</title><link>http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html</link><dc:creator>浩毛</dc:creator><author>浩毛</author><pubDate>Sun, 27 Sep 2009 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html</guid><wfw:comment>http://www.cppblog.com/jaxe/comments/97362.html</wfw:comment><comments>http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jaxe/comments/commentRss/97362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaxe/services/trackbacks/97362.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 上一篇内存池的实现其实更像一个后备列表的实现。使用上来说不是很方便，要申请的内存块是一个BLOCK结构的一个个成员，而且每次从系统内存堆中申请都是一小块一小块，也没有考虑字节对齐。因此让我们来看看新的一个内存池的实现吧。&nbsp;&nbsp;&nbsp; 这个内存池是根据《c++应用程序性能优化》书里的固定尺寸的内存池原理做了一些改动用C语言写的。大家有兴趣...&nbsp;&nbsp;<a href='http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html'>阅读全文</a><img src ="http://www.cppblog.com/jaxe/aggbug/97362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaxe/" target="_blank">浩毛</a> 2009-09-27 14:50 <a href="http://www.cppblog.com/jaxe/archive/2009/09/27/97362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单实用的内存池之一（c实现)</title><link>http://www.cppblog.com/jaxe/archive/2009/09/17/96581.html</link><dc:creator>浩毛</dc:creator><author>浩毛</author><pubDate>Thu, 17 Sep 2009 14:34:00 GMT</pubDate><guid>http://www.cppblog.com/jaxe/archive/2009/09/17/96581.html</guid><wfw:comment>http://www.cppblog.com/jaxe/comments/96581.html</wfw:comment><comments>http://www.cppblog.com/jaxe/archive/2009/09/17/96581.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/jaxe/comments/commentRss/96581.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaxe/services/trackbacks/96581.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp; 都知道频繁分配内存释放内存很耗系统资源，而且容易造成内存碎片。因此写了个简单的内存池实现，越简单越好，为什么？做复杂了效率还不如直接malloc。因此这个内存池采用链表连接内存块的方式，分配的是固定大小的内存块，从池中取内存和归还内存是用的空闲链表堆栈操作， 没有使用线程锁，如果要线程安全，建议在外部调用内存池的地方加锁。<br><br>&nbsp;&nbsp; &nbsp; 做过一个简单的测试，10万次内存池调用的效率大概比直接分配释放内存提高了30-50%。但是前提是内存池不能加锁（pthread_mutex），加锁的内存池效率和直接分配内存的效率差不多，有时候还要多点点。（测试的环境是每次2K，4个双核CPU，FREEBSD7）<br><br>代码实现：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock<br><img id=Codehighlighter1_16_128_Open_Image onclick="this.style.display='none'; Codehighlighter1_16_128_Open_Text.style.display='none'; Codehighlighter1_16_128_Closed_Image.style.display='inline'; Codehighlighter1_16_128_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_16_128_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_128_Closed_Text.style.display='none'; Codehighlighter1_16_128_Open_Image.style.display='inline'; Codehighlighter1_16_128_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_16_128_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_16_128_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;next;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;createnext;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
<br><br>
<div style="PADDING-RIGHT: 5px; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-LEFT-COLOR: rgb(204,204,204); PADDING-BOTTOM: 4px; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">memblock大小</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unused;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">空闲的memblock大小</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datasize;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">每次分配的数据大小(就是memblock.data)</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;free_linkhead;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">空闲memblock链表头</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;create_linkhead;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">所有创建的memblock链表头，内存池释放的时候使用，防止内存池释放的似乎还有memblock未归还的情况</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br>};<br>typedef&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">free_callback)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放回调函数，释放membloc.data用，可以简单的直接用free函数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mempool_init(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;initialSize,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;datasize);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化mempool</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mempool_dealloc(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool,free_callback&nbsp;callback);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放mempool</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mempool_get(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取一个memblock</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mempool_release(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool,</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">归还一个memblock</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">********************************<br>&nbsp;*&nbsp;mempool<br>&nbsp;*&nbsp;*****************************</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">malloc一个memblock</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;mempool_allocblock(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool&nbsp;);<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">------------------implement--------</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"><br>mempool_init(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;initialSize,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;datasize&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;malloc(&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool&nbsp;)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">unused&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">datasize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;datasize;<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">预先初始化initialSize个内存块</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;initialSize;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mempool_allocblock(&nbsp;pool&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mempool_release(&nbsp;pool,&nbsp;block&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(&nbsp;pool&nbsp;);<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br>mempool_dealloc(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool,&nbsp;free_callback&nbsp;callback&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将所有创建的memblock释放了</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">createnext;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">执行free回调。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;callback&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">callback&nbsp;)(&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(&nbsp;block&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;free(&nbsp;pool&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;L_DEBUG(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s:size(%d),unused(%d)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;__func__,&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">size,&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">unused&nbsp;);<br>}<br><br></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"><br>mempool_allocblock(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;malloc(&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock&nbsp;)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;malloc(&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">datasize&nbsp;)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">used&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">表示已使用<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">加入所有创建的memblock的链表头</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">createnext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead;<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">create_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;block;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">size</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(&nbsp;block&nbsp;);<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br>mempool_release(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool,&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;block&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_WARN(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s:release&nbsp;a&nbsp;NULL!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;__func__&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">used&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_WARN(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s:used!=1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;__func__&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将归还的内存块放到空闲链表头。</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">used&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">表示空闲</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead;<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;block;<br>&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">unused</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">空闲数+1</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"><br>mempool_get(&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;mempool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pool&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;memblock</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从空闲链表头取出一个内存块</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">free_linkhead</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">used&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">表示已使用</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">unused</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">空闲内存块数-1</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">没有空闲的内存块，创建一个</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mempool_allocblock(&nbsp;pool&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(&nbsp;block&nbsp;);<br>}</span></div>
<img src ="http://www.cppblog.com/jaxe/aggbug/96581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaxe/" target="_blank">浩毛</a> 2009-09-17 22:34 <a href="http://www.cppblog.com/jaxe/archive/2009/09/17/96581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>