﻿<?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++博客-cyt-随笔分类-Work</title><link>http://www.cppblog.com/cyt/category/102.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 14:17:21 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 14:17:21 GMT</pubDate><ttl>60</ttl><item><title>如何在windows service里面控制console程序退出</title><link>http://www.cppblog.com/cyt/archive/2008/01/08/40723.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Tue, 08 Jan 2008 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2008/01/08/40723.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/40723.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2008/01/08/40723.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/40723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/40723.html</trackback:ping><description><![CDATA[首先，要控制windows services，是比较容易的事情，一堆现成的例子。<br><a href="http://www.codeproject.com/KB/system/xyntservice.aspx">SYNtService</a> 就是一个很好的例子。<br>要控制一个窗口退出是十分容易的事情，PostMessage就可以解决问题。<br>要控制console退出，也有很多现成的方法。比较通用的方法：<br>1、TerminateProcess<br>&nbsp;&nbsp; 最原始、最暴力的强制console退出的方法。console进程毫无还手之力就over了。但我希望console在推出之前至少能处理一下&#8220;后事&#8221;。<br><br>2、signal / raise<br>&nbsp;&nbsp; 原来windows也有signal，不过kill换成了raise。但是相对Unix系列的signal功能就差很远了。而且有一个麻烦的地方就是raise只能对本console生效，而不能对指定的process。<br>&nbsp;&nbsp; 可以在signal里面指定一个call back函数，在收到SIGINT/SIGTERM之类的时候，处理一下事情，然后通知各个线程结束。<br>&nbsp;&nbsp; 既然不能raise其他进程，是否这个功能就不能用了呢？其实可以考虑一下CreateRemoteThread，然后在别人的进程里面raise&#8230;&#8230;<br><br>3、SetConsoleCtrlHandler / GenerateConsoleCtrlEvent<br>&nbsp;&nbsp;&nbsp; 这个是console专门用来处理Ctrl-C/Ctrl-Break/以及windows关机事件等的处理方法。比signal更强大。而且说明中写了，可以对其他的进程进行处理（还可以对进程组处理）。用网上的话说就是：很女子，很弓虽！<br>&nbsp;&nbsp;&nbsp; 但是要注意，如果要对其创建的子进程进行处理的时候，创建子进程必须要使用CREATE_NEW_PROCESS_GROUP标志。另外一点，文档写的比较隐晦的就是，进程必须要有console窗口。否则，调用GenerateConsoleCtrlEvent会返回6，说ERROR_INVALID_HANDLE。<br>&nbsp;&nbsp;&nbsp; 问题来了，Service本身是没有console窗口的，Service建立的子进程就必须要自带窗口了。但是一般为了美观，Service启动的进程都不想带有窗口。那就变成了子进程没有console窗口，GenerateConsoleCtrlEvent失效了。<br>&nbsp;&nbsp;&nbsp; 在网上查了很多资料（怎么没看到很黄很暴力呢？？？），其中在<strong><span class="FakeLink" onclick="window.location=getMailto();" onmouseover="window.status='Click to send e-mail.';" onmouseout="window.status='';">
</span></strong><span class="FakeLink" onclick="window.location=getMailto();" onmouseover="window.status='Click to send e-mail.';" onmouseout="window.status='';">Louis K. Thomas
&lt;loui<span style="display: none;">N&#216;SP@M</span>sth@hotm<span style="display: none;">&#209;OSP@M</span>ail.co<span style="display: none;">N&#213;SP@M</span>m&gt; 的</span> <a href="http://www.latenighthacking.com/projects/2003/sendSignal/">SendSignal</a><span style="text-decoration: underline;"></span> 提到一种做法，就是先获得kernel32!CtrlRoutine的入口，然后通过CreateRemoteThread的方法，让远程的console来执行kernel32!CtrlRoutine。但这种方法有个问题，在获得kernel32!CtrlRoutine的时候，也是使用GenerateConsoleCtrlEvent来获得。但是Service自己本身没有console窗口，一调用GenerateConsoleCtrlEvent也是出错。<br>而另一篇 <a  href="http://groups.google.com/group/microsoft.public.win32.programmer.kernel/browse_thread/thread/a705105bc415a409/a5d6a5161fcb7450?hl=en&amp;lnk=st&amp;q=GenerateConsoleCtrlEvent+++ERROR_INVALID_HANDLE#a5d6a5161fcb7450">google讨论组</a> 文章，里面提到原来可以先AllocConsole、然后GenerateConsoleCtrlEvent、然后FreeConsole&#8230;&#8230;于是解决方案就变成：<br>Service里面:<br>&nbsp; 先AllocConsole<br>&nbsp; 然后利用GenerateConsoleCtrlEvent获得kernel32!CtrlRoutine<br>&nbsp; 然后FreeConsole<br>&nbsp; 当需要结束进程的时候，就调用CreateRemoteThread，把kernel32!CtrlRoutine的代码注入到子process中执行<br>&nbsp; 这样大家都看不到console窗口（service里面AllocConsole很快，看不到窗口出来，甚至怀疑根本就有没有窗口出来），同时又能通知子进程优雅地退出。<br><br>存在问题：如果我的机器作为服务器启动，即没有进入登录状态，不知道这样启动的Service会不会有问题呢？？暂时还没有时间测试。<br><br><br>&nbsp;&nbsp;&nbsp; <br><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; <br></span><strong style="color: black; background-color: #a0ffff;"></strong><br> <img src ="http://www.cppblog.com/cyt/aggbug/40723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2008-01-08 16:07 <a href="http://www.cppblog.com/cyt/archive/2008/01/08/40723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>补充一个OCI的问题</title><link>http://www.cppblog.com/cyt/archive/2007/03/30/20912.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 29 Mar 2007 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2007/03/30/20912.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/20912.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2007/03/30/20912.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/20912.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/20912.html</trackback:ping><description><![CDATA[
		<p>前几天客户投诉我们提供的一个访问Oracle的程序，说运行太慢了，半天都没有处理完数据。<br />客户数据也就几十万条，也不是什么海量数据，究竟什么原因呢。而且奇怪的是我们提供的其它类似的程序访问同一张数据表却没有任何的问题。<br />经过多次反复写测试程序，尝试各种的条件，最后发现原来是其中一条update语句执行很慢，要2秒钟才更新一条。而这条update语句的where部分有两个条件，一个是整数的比较条件，一个是日期的比较条件。当然很容易就可以通过测试排除了整数条件导致慢的可能性。剩下的原因就是日期比较条件导致慢了。<br />说得也奇怪，日期条件是通过param的方式传入参数的，执行很慢。但测试的时候如果把日期条件展开，把日期条件变成SQL的一部分，那就执行很快了。先不论为什么这么奇怪，要知道Oracle SQL语句的日期条件不是一般的麻烦，都要经过TO_DATE/TO_CHAR糊弄来糊弄去，SQL语句跟其他的数据库不一样，程序就失去通用性了。一定是自己调用OCI的时候犯了什么糊涂错误了。<br />最后还是发现有一个不妥当的地方：数据库字段类型是DATE，而我用OCI绑定param的时候，用的却是SQLT_TIMESTAMP。原因是我想偷懒，希望用OraDateStruct就解决OCI的日期类型。于是我尝试用回SQLT_DAT，自己“笨笨的”把时间转换为OCI所能辨认的7个byte的数组，然后运行程序。速度太快了，一下子就执行完了。<br />其实不明白的是，Oracle发现类型不匹配，要不就报错；要不就把条件变为相容的数据进行查询。但是现在从现象看来，Oracle像是把所有保存的数据逐个转换成为与条件相容的类型进行判断，而不是转换条件的类型。所以每次update都变成了遍历所有的数据。难道是存在DBA可以调整的优化策略？？不明白，不明白……</p>
<img src ="http://www.cppblog.com/cyt/aggbug/20912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2007-03-30 00:00 <a href="http://www.cppblog.com/cyt/archive/2007/03/30/20912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenDBX 一个访问多数据库的C类库</title><link>http://www.cppblog.com/cyt/archive/2007/03/29/20908.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 29 Mar 2007 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2007/03/29/20908.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/20908.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2007/03/29/20908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/20908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/20908.html</trackback:ping><description><![CDATA[
		<a href="http://www.linuxnetworks.de/opendbx/">http://www.linuxnetworks.de/opendbx/</a>
		<br />
		<br />OpenDBX，一个开源的、简单的、可以访问多种数据库的C类库。按作者说的，已经支持：<br /><ul><li>Firebird</li><li>Interbase</li><li>MS SQL Server</li><li>MySQL</li><li>Oracle</li><li>PostgreSQL</li><li>SQLite</li><li>SQLite3</li><li>Sybase</li></ul>而且好像是使用动态载入模块方式，即dlopen打开相应驱动模块的so的方式，是有点ODBC的味道。<br />不过支持的数据类型以及SQL查询的功能有限。<br />留着以后可能会有些参考价值。<img src ="http://www.cppblog.com/cyt/aggbug/20908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2007-03-29 23:31 <a href="http://www.cppblog.com/cyt/archive/2007/03/29/20908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移植代码到64bits碰上的问题</title><link>http://www.cppblog.com/cyt/archive/2007/03/29/20907.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 29 Mar 2007 15:15:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2007/03/29/20907.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/20907.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2007/03/29/20907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/20907.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/20907.html</trackback:ping><description><![CDATA[
		<p>一晃眼，原来又有好几个月没有上来。其间写了几个月的javascript，写了几个月的JSP，C++的东西都没有怎么碰过了。<br /><br />这几天要原来项目的C++代码从32bit的平台移植到64bit的平台。由于以前编写类库的时候已经十分小心，也早有预谋，所以竟然很顺利的全部编译通过，而且-Wall下面都没有任何warning。满心欢喜之下运行了程序。谁知道马上就是一个Segment faul。沮丧之余用gdb跟踪了半天都不知道什么地方的问题。加上valgrind，也是一头雾水，竟然是说标准STL的hash_map的问题……最后在一次跟踪的时候，无意中检查一个指针的初始化值，发现不为空，原因应该就在这里。<br />翻查代码的上下文，原来指针是跟一个int放在同一个union当中，而union的初始化只初始化了int，而没有初始化指针。在64bit机器的gcc下，int是32bit而指针是64bit，所以就导致指针不为空的现象。所以赶紧把代码中所有union的地方都找出来检查一遍。幸好union这种东西平时不敢多用，也没发现其他的异常。程序重新编译，再运行，没有Segment fault了。<br /><br />然后再运行了一批unit test。发现其中有几个不能通过，其原因其实也是比较无聊。都是自己不小心之过：<br />1、sha1的代码copy php的，其中一个php_uint32变量竟然自己写了unigned long，傻瓜致极<br />2、有个地方保存各种长度整数到文件，因为偷懒，把函数写成了模板，大概就是：<br />   template&lt;typename typeInt&gt;<br />      int write(typeInt n) {<br />         writeToFile( &amp;n, sizeof(n));<br />      }<br />   然后一个不小心，想写个string的长度的时候就变成了：  write( str.length() );<br />   str.length()类型是size_t，64bit，与32bit系统的不一样，当然也就出错了。<br />   其实平时都已经很小心，尽量使用static_cast强制转换为特定长度类型的变量再输出的了，偏偏就是漏了一两个地方。</p>
<img src ="http://www.cppblog.com/cyt/aggbug/20907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2007-03-29 23:15 <a href="http://www.cppblog.com/cyt/archive/2007/03/29/20907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db4o and GigaBase</title><link>http://www.cppblog.com/cyt/archive/2006/11/17/15303.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Fri, 17 Nov 2006 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/11/17/15303.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/15303.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/11/17/15303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/15303.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/15303.html</trackback:ping><description><![CDATA[    昨晚参加了<a class="" title="db4o" href="http://www.db4o.com/china/Default.aspx?src=cn&amp;AspxAutoDetectCookieSupport=1" target="_blank">db4o</a>的RoadShow，终于见到英俊潇洒玉树临风，传说中的Matrix群主<span style="COLOR: red">Chris <img height="20" src="http://www.cppblog.com/Emoticons/QQ/laf.gif" width="20" border="0" /><br /><font color="#000000">    db4o给我的印象就是不依赖关系数据库的“Hibernate”，完全就是全自动对象序列化 + 超强查询。按照官方给出的数据，其嵌入式的应用环境下性能真的是无出其右了。但按我的理解，由于没有低粒度锁，必然存在无法解决的并发冲突，或者并发读问题不大，并发更改性能应该会有影响。究竟用了什么超强技术那就不知道，或者有空找来研究一下。个人感觉db4o并不是要用来替代数据库，而是数据保存的一个辅助。十分适合用于Cache系统或者应用于嵌入式设备。db4o只提供Java和C#接口，对于目前PDA应用来说似乎要求高了点。就如Rayman所说，解决了CPU和内存问题还有一个电源问题估计PDA近期也无法解决。<span style="COLOR: red">Christof<font color="#000000">一再强调其三段式事务保证数据文件完整；快速易用的开发模式；超大规模数据的支持……至于他们公司的开源盈利模式，小弟英文水平有限，听不懂了。<br />    很久以前就提到过<a class="" title="GigaBase" href="http://www.garret.ru/~knizhnik/gigabase.html" target="_blank">GigaBase</a>，似乎就是db4o的C++版本。不过C++先天不足，缺少反射机制，实现当然不能像db4o般优美了。但似乎这个选择也不错，可以告别BerkeleyDB、sqlit……从此步入OO数据保存的“天堂”……</font></span></font></span><img src ="http://www.cppblog.com/cyt/aggbug/15303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-11-17 17:11 <a href="http://www.cppblog.com/cyt/archive/2006/11/17/15303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实在惭愧</title><link>http://www.cppblog.com/cyt/archive/2006/11/12/15090.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Sun, 12 Nov 2006 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/11/12/15090.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/15090.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/11/12/15090.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/15090.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/15090.html</trackback:ping><description><![CDATA[转眼原来自己已经大半年没有上来写log，同时也发现原来大半年没有去研究C++技术了。<br />工作的需要，这半年来一直写在javascript，一个让人又爱又恨的语言。简单灵活的语法、却又带来无穷的陷阱。换一种思考角度的开发方式，使习惯于传统语言的我开始的时候难以适应。<br />开发的时候经常在想如何把javascript的好处带入到C++。或许boost的<a href="http://www.boost.org/libs/any/index.html">any</a>、<a href="http://www.boost.org/libs/lambda/index.html">lambda</a> 、<a href="http://www.boost.org/libs/function/index.html">function</a> 、<a href="http://www.boost.org/libs/signals/index.html">signals</a>可以为C++开发带入少少的javascript乐趣。<img src ="http://www.cppblog.com/cyt/aggbug/15090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-11-12 17:45 <a href="http://www.cppblog.com/cyt/archive/2006/11/12/15090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新版本的Qu</title><link>http://www.cppblog.com/cyt/archive/2006/04/14/5594.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Fri, 14 Apr 2006 15:09:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/04/14/5594.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/5594.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/04/14/5594.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/5594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/5594.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Qu语言又出了新版本，引入了很多新的、吸引人的特性。&nbsp;&nbsp;<a href='http://www.cppblog.com/cyt/archive/2006/04/14/5594.html'>阅读全文</a><img src ="http://www.cppblog.com/cyt/aggbug/5594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-04-14 23:09 <a href="http://www.cppblog.com/cyt/archive/2006/04/14/5594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OCI访问Oracle的一些刁钻问题</title><link>http://www.cppblog.com/cyt/archive/2006/04/14/5591.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Fri, 14 Apr 2006 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/04/14/5591.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/5591.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/04/14/5591.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/5591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/5591.html</trackback:ping><description><![CDATA[
		<p>1、CLOG/BLOG的插入<br /> 找了很多OCI的例子以及一些PHP的例子，基本上都是同一种做法：<br /> a、OCIStmtPrepare预处理SQL语句："insert into mytable (myimg) values (empty_blob()) returning myimg into :pImg"<br /> b、调用OCIDescriptorAlloc，用参数OCI_DTYPE_LOB，获得一个LOB的句柄<br /> c、用OCIStmtBindByPos或者OCIStmtBindByName，把LOB句柄和参数:pImg绑定<br /> d、OCIStmtExecute执行<br /> e、OCILobWrite往LOB里面写数据<br /> f、commit和释放资源等等<br /> <br /> 问题是这个SQL语句也太特别了，和其他数据库的SQL不一样。但是在java的实现中，并不需要这么奇怪的语法。<br /> insert into mytable (myimg) values(?)<br /> 就足够了。<br /> 在我们的应用中，能够统一同一种SQL的写法当然是最好的，最好就是：<br /> insert into mytable (myimg) values (:pImg) 那就和其他的数据处理一致了。<br /> <br /> 做了很多的尝试，终于找到解决的方法：<br /> a、OCIStmtPrepare预处理SQL语句："insert into mytable (myimg) values (:pImg)"<br /> b、调用OCIDescriptorAlloc，用参数OCI_DTYPE_LOB，获得一个LOB的句柄<br /> c、通过OCILobCreateTemporary函数，为LOB句柄创建临时LOB对象<br /> d、OCILobWriteAppend往LOB句柄写数据<br /> e、用OCIStmtBindByPos或者OCIStmtBindByName，把LOB句柄和参数:pImg绑定<br /> f、OCIStmtExecute执行<br /> g、commit和释放资源等等<br /> <br /> 经过简单的封装，LOB操作简单很多了：<br /> TDBConnection conn = TDatabase::getConnection( strConnection );<br /> TDBStatement dbStatement(conn.getStatement());<br /> dbStatement.prepareSQL( "insert into mytable (myimg) values (:pImg)" );<br /> dbStatement.getParam("pImg").attachInputStream( fStream );<br /> dbStatement.execSQL();<br /> conn.commite();<br /> <br />2、空字符串<br /> 插入一个空字符串，OCIBindByPos/OCIBindByName的时候，那个字符串的数据类型，不能是SQLT_LVC，用SQLT_CHR倒是没有问题。<br /> 具体为什么，只有Oracle自己知道了。<br /> <br />3、指定IP连接Oracle<br /> 通过OCIServerAttach里面指定绑定的SID连接数据库。用SID连接Oracle当然有它的好处。奇怪的是JDBC能用IP和Port指定连接哪个Oracle。<br /> 找遍OCI的帮助都找不到IP连接方法。google了很久，找到解决的方法，自己生成SID：<br /> string strSID = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%1)(PORT=%2)))(CONNECT_DATA=(SERVICE_NAME=%3)))";<br /> 里面的%1设为Oracle服务器的IP；%2设为Oracle服务器的Port，一般是1521；%3就是database的名字。<br /> 把这个字符串放入OCIServerAttach</p>
		<p> </p>
<img src ="http://www.cppblog.com/cyt/aggbug/5591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-04-14 22:24 <a href="http://www.cppblog.com/cyt/archive/2006/04/14/5591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux的系统性能监测参数获取</title><link>http://www.cppblog.com/cyt/archive/2006/03/02/3660.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 02 Mar 2006 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/03/02/3660.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/3660.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/03/02/3660.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/3660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/3660.html</trackback:ping><description><![CDATA[<P>目前的工程需要简单的监测一下Linux系统的：CPU负载、内存消耗情况、几个指定目录的磁盘空间、磁盘I/O、swap的情况还有就是网络流量。<BR>Linux下的性能检测工具其实都有很多。mrtg（<A href="http://people.ee.ethz.ch/~oetiker/webtools/mrtg/">http://people.ee.ethz.ch/~oetiker/webtools/mrtg/</A>）就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤，似乎比较麻烦。本来也想直接调用sar、vmstat之类的命令，parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本parse它们的结果，那还不如直接去系统里面获得算了。于是研究了一下sysstat（<A href="http://freshmeat.net/projects/sysstat/">http://freshmeat.net/projects/sysstat/</A>）和gkrellm（<A href="http://gkrellm.net">http://gkrellm.net</A> ）的源代码，找到监测性能的数据所在。<BR><BR>1、CPU<BR>&nbsp;&nbsp;&nbsp;在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是：user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在，CPU的每tick用在了哪里。例如：<BR>cpu0 256279030 0 11832528 1637168262<BR>就是cpu0从开机到现在有256279030 tick用在了user消耗，11832528用在了sys消耗。所以如果想计算单位时间（例如1s）里面CPU的负载，那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。gkrellm就是这样实现的：((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2<BR>例如，第一次读取/proc/stat，user的值是256279030；一秒以后再读一次，值是256289030，那么CPU在这一秒的user消耗就是：((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。<BR><BR>2、内存消耗<BR>&nbsp;&nbsp;&nbsp;文件"/proc/meminfo"里面包含的就是内存的信息，还包括了swap的信息。例如：<BR>$ cat /proc/meminfo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total:&nbsp;&nbsp;&nbsp; used:&nbsp;&nbsp;&nbsp; free:&nbsp; shared: buffers:&nbsp; cached:<BR>Mem:&nbsp; 1057009664 851668992 205340672&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 67616768 367820800<BR>Swap: 2146787328 164429824 1982357504<BR>MemTotal:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1032236 kB<BR>MemFree:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200528 kB<BR>MemShared:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 kB<BR>……<BR>不过从gkrellm的源代码看，有些版本没有前面那两行统计的信息，只能够根据下面的Key: Value这种各式的数据收集。<BR><BR>3、磁盘空间<BR>&nbsp;&nbsp;&nbsp;从gkrellm的源代码看，这个是一个很复杂的数据。磁盘分区的数据有可能分布在：/proc/mounts、/proc/diskstats、/proc/partitions等等。而且如果想要检查某几个特定的路径，还需要通过mount、df等命令的帮助。为了减少麻烦，这个数据我就直接用statfs函数直接获得了。<BR>int statfs(const char *path, struct statfs *buf);<BR>这个函数只需要输入需要检查的路径名称，就可以返回这个路径所在的分区的空间使用情况：<BR>总空间：buf.f_bsize * buf.f_blocks<BR>空余空间：buf.f_bsize * buf.f_bavail<BR><BR>4、磁盘I/O<BR>&nbsp;&nbsp;&nbsp;磁盘I/O的数据也同样比较复杂，有些版本看/proc/diskstats，有些版本看/proc/partitions，还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样，需要隔一段时间取值，两次取值的差就是流量。<BR><BR>5、网络流量<BR>&nbsp;&nbsp;&nbsp;网络流量也是五花八门，不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。<BR><BR>&nbsp;&nbsp;&nbsp;以上就是数据获得源头。程序也比较好写，不外乎就是打开一些文件，逐行读出来然后用sscanf来parse一下数据就可以了。</P><img src ="http://www.cppblog.com/cyt/aggbug/3660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-03-02 22:54 <a href="http://www.cppblog.com/cyt/archive/2006/03/02/3660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的类型安全format输出后记</title><link>http://www.cppblog.com/cyt/archive/2006/03/02/3643.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 02 Mar 2006 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/03/02/3643.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/3643.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/03/02/3643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/3643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/3643.html</trackback:ping><description><![CDATA[以前曾经写过一个类型安全的format输出，（见<A HREF="/cyt/archive/2005/10/08/578.html">http://www.cppblog.com/cyt/archive/2005/10/08/578.html</A>）。<BR>今天又在codeporject里面发现有类似的CFormat(<A href="http://www.codeproject.com/useritems/pja_format.asp">http://www.codeproject.com/useritems/pja_format.asp</A>)。不过同样是那一句，很多人还是建议使用boost。不过本人老觉得boost那套东西性能有些问题，而且想把format独立出来使用基本上不可能，所以一直以来还是使用自己写的那个format_stream和format_string。<BR>自己写的format_string在输出百分比的数据的时候有问题，理由是没有在‘%’后面加参数，所以没办法识别‘%’是占位符还是真正的‘%’号。虽然程序简单的把‘%%’认为是一个‘%’号。但是要输出百分数的时候如果写 "%%%"的话，则优先把前面的‘%%’变成了‘%’号了。我曾经把程序简单修改为碰到三个‘%’的时候，就视第一个为占位符，后面两个就合在一起变为‘%’号了。但始终在解释的时候有些怪怪的。例如连续四个‘%’，五个呢？后来，我就更干脆不改，所有输出百分数的时候一律写：str.format("percent: %").arg( nPercent, '%').str();<BR>另外一个麻烦的就是输出16进制数的时候，那个argWithFormat参数也太多了点，有时候想简单输出一下都要填半天参数，估计参考CFormat的Hex实现也是一个不错的选择。反正只要能支持 &lt;&lt; 操作的对象都能用在format_string里面。<BR>format_stream/format_string的确是目前开发中用得最多的类。不过有时候讨论起来，为什么非要用format方式，难道就是因为好看的原因？前几天在看i18n，终于看到一个format_xxxx的优势：输出字符串的替换明显工作量少了很多很多。<BR><BR>在用javascript开发的日子，还是忘不了 format_xxxxx，于是有写了个javascript的版本：<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 id=Codehighlighter1_36_68_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_68_Open_Text.style.display='none'; Codehighlighter1_36_68_Closed_Image.style.display='inline'; Codehighlighter1_36_68_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_36_68_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_68_Closed_Text.style.display='none'; Codehighlighter1_36_68_Open_Image.style.display='inline'; Codehighlighter1_36_68_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;_formatString(&nbsp;strFormat&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_36_68_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_36_68_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.format(&nbsp;strFormat&nbsp;);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_129_200_Open_Image onclick="this.style.display='none'; Codehighlighter1_129_200_Open_Text.style.display='none'; Codehighlighter1_129_200_Closed_Image.style.display='inline'; Codehighlighter1_129_200_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_129_200_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_200_Closed_Text.style.display='none'; Codehighlighter1_129_200_Open_Image.style.display='inline'; Codehighlighter1_129_200_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>_formatString.prototype.format&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;strPattern&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_129_200_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_129_200_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;strPattern;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_254_679_Open_Image onclick="this.style.display='none'; Codehighlighter1_254_679_Open_Text.style.display='none'; Codehighlighter1_254_679_Closed_Image.style.display='inline'; Codehighlighter1_254_679_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_254_679_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_254_679_Closed_Text.style.display='none'; Codehighlighter1_254_679_Open_Image.style.display='inline'; Codehighlighter1_254_679_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>_formatString.prototype._moveToNext&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;()&nbsp;</SPAN><SPAN id=Codehighlighter1_254_679_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_254_679_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG id=Codehighlighter1_312_660_Open_Image onclick="this.style.display='none'; Codehighlighter1_312_660_Open_Text.style.display='none'; Codehighlighter1_312_660_Closed_Image.style.display='inline'; Codehighlighter1_312_660_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_312_660_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_312_660_Closed_Text.style.display='none'; Codehighlighter1_312_660_Open_Image.style.display='inline'; Codehighlighter1_312_660_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern.length;&nbsp;</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_312_660_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_312_660_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&nbsp;ch&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern.charAt(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;);<BR><IMG id=Codehighlighter1_389_612_Open_Image onclick="this.style.display='none'; Codehighlighter1_389_612_Open_Text.style.display='none'; Codehighlighter1_389_612_Closed_Image.style.display='inline'; Codehighlighter1_389_612_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_389_612_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_389_612_Closed_Text.style.display='none'; Codehighlighter1_389_612_Open_Image.style.display='inline'; Codehighlighter1_389_612_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;ch&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_389_612_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_389_612_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p;<BR><IMG id=Codehighlighter1_506_554_Open_Image onclick="this.style.display='none'; Codehighlighter1_506_554_Open_Text.style.display='none'; Codehighlighter1_506_554_Closed_Image.style.display='inline'; Codehighlighter1_506_554_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_506_554_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_506_554_Closed_Text.style.display='none'; Codehighlighter1_506_554_Open_Image.style.display='inline'; Codehighlighter1_506_554_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern.length&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern.charAt(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;)&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_506_554_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_506_554_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_561_598_Open_Image onclick="this.style.display='none'; Codehighlighter1_561_598_Open_Text.style.display='none'; Codehighlighter1_561_598_Closed_Image.style.display='inline'; Codehighlighter1_561_598_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_561_598_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_561_598_Closed_Text.style.display='none'; Codehighlighter1_561_598_Open_Image.style.display='inline'; Codehighlighter1_561_598_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_561_598_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_561_598_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">break</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;ch;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_725_799_Open_Image onclick="this.style.display='none'; Codehighlighter1_725_799_Open_Text.style.display='none'; Codehighlighter1_725_799_Closed_Image.style.display='inline'; Codehighlighter1_725_799_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_725_799_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_725_799_Closed_Text.style.display='none'; Codehighlighter1_725_799_Open_Image.style.display='inline'; Codehighlighter1_725_799_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>_formatString.prototype.str&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;()&nbsp;</SPAN><SPAN id=Codehighlighter1_725_799_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_725_799_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._pattern.substr(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._p&nbsp;);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_830_876_Open_Image onclick="this.style.display='none'; Codehighlighter1_830_876_Open_Text.style.display='none'; Codehighlighter1_830_876_Closed_Image.style.display='inline'; Codehighlighter1_830_876_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_830_876_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_830_876_Closed_Text.style.display='none'; Codehighlighter1_830_876_Open_Image.style.display='inline'; Codehighlighter1_830_876_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;fmt(&nbsp;strPattern&nbsp;)&nbsp;</SPAN><SPAN id=Codehighlighter1_830_876_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_830_876_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;_formatString(&nbsp;strPattern&nbsp;);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_920_1055_Open_Image onclick="this.style.display='none'; Codehighlighter1_920_1055_Open_Text.style.display='none'; Codehighlighter1_920_1055_Closed_Image.style.display='inline'; Codehighlighter1_920_1055_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_920_1055_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_920_1055_Closed_Text.style.display='none'; Codehighlighter1_920_1055_Open_Image.style.display='inline'; Codehighlighter1_920_1055_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>_formatString.prototype.a&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;()&nbsp;</SPAN><SPAN id=Codehighlighter1_920_1055_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_920_1055_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._moveToNext();<BR><IMG id=Codehighlighter1_993_1034_Open_Image onclick="this.style.display='none'; Codehighlighter1_993_1034_Open_Text.style.display='none'; Codehighlighter1_993_1034_Closed_Image.style.display='inline'; Codehighlighter1_993_1034_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_993_1034_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_993_1034_Closed_Text.style.display='none'; Codehighlighter1_993_1034_Open_Image.style.display='inline'; Codehighlighter1_993_1034_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">var</SPAN><SPAN style="COLOR: #000000">&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;arguments.length;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN id=Codehighlighter1_993_1034_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_993_1034_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">._res&nbsp;</SPAN><SPAN style="COLOR: #000000">+=</SPAN><SPAN style="COLOR: #000000">&nbsp;arguments[i];<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_1098_1123_Open_Image onclick="this.style.display='none'; Codehighlighter1_1098_1123_Open_Text.style.display='none'; Codehighlighter1_1098_1123_Closed_Image.style.display='inline'; Codehighlighter1_1098_1123_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_1098_1123_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1098_1123_Closed_Text.style.display='none'; Codehighlighter1_1098_1123_Open_Image.style.display='inline'; Codehighlighter1_1098_1123_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>_formatString.prototype.s&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">function</SPAN><SPAN style="COLOR: #000000">&nbsp;()&nbsp;</SPAN><SPAN id=Codehighlighter1_1098_1123_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_1098_1123_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.str();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV><BR>用起来大概就是：<BR><BR>var width = 400;<BR>var height = 340;<BR>var left = (screen.availWidth - width) / 2;<BR>var top&nbsp; = (screen.availHeight - height) / 2;<BR>window.open('RYFL_lx.jsp', null,&nbsp; fmt(&nbsp;'width=%,height=%,left=%,top=%').a(width).a(height).a(left).a(top).s() );&nbsp;<BR><img src ="http://www.cppblog.com/cyt/aggbug/3643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-03-02 16:17 <a href="http://www.cppblog.com/cyt/archive/2006/03/02/3643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lib介绍，GNU Lightning内嵌汇编的C++封装</title><link>http://www.cppblog.com/cyt/archive/2006/01/19/2910.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 19 Jan 2006 09:45:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/01/19/2910.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/2910.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/01/19/2910.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/2910.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/2910.html</trackback:ping><description><![CDATA[<P>froofyJIT，来自 http://fzort.org/bi/sw/froofy/<BR><BR>先说说 GNU Lightning，来自 <A href="http://www.gnu.org/software/lightning/lightning.html">http://www.gnu.org/software/lightning/lightning.html</A><BR>一个GNU的项目，目的是可以在C/C++中写跨CPU的汇编代码，目前支持CPU有x86, SPARC和PowerPC （但浮点数操作只支持x86系列）。<BR>个人觉得还是挺有意思的一个项目。有时候一些关键操作还是需要汇编来处理一下，例如加解密运算、图像处理等等。以前都是直接嵌套汇编，但这样一来就会失去C代码的通用性；又或者通过#define来实现多个CPU下的汇编实现。如果用GNU Lightning，至少代码统一，管理上好很多。不过换来的代价就是要多学一门“汇编”了。<BR><BR>GNU Lightning写的代码也不是很好看，原因是它本身是C代码，调用的是C函数形式。froofyJIT就是解决这个问题，下面是froofyJIT重写GNU Lightning中的计算费波纳数列的代码的节选：<BR><BR>GNU Lightning:</P>
<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: #000000">typedef&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">pifi)(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>pifi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfibs&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(pifi)&nbsp;(jit_set_ip(codeBuffer).iptr);<BR><IMG id=Codehighlighter1_97_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_97_124_Open_Text.style.display='none'; Codehighlighter1_97_124_Closed_Image.style.display='inline'; Codehighlighter1_97_124_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_97_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_97_124_Closed_Text.style.display='none'; Codehighlighter1_97_124_Open_Image.style.display='inline'; Codehighlighter1_97_124_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_97_124_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">/**/</SPAN><SPAN id=Codehighlighter1_97_124_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;offset&nbsp;of&nbsp;the&nbsp;argument&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_144_179_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_179_Open_Text.style.display='none'; Codehighlighter1_144_179_Closed_Image.style.display='inline'; Codehighlighter1_144_179_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_144_179_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_179_Closed_Text.style.display='none'; Codehighlighter1_144_179_Open_Image.style.display='inline'; Codehighlighter1_144_179_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>jit_insn&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #0000ff">ref</SPAN><SPAN style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_144_179_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">/**/</SPAN><SPAN id=Codehighlighter1_144_179_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;to&nbsp;patch&nbsp;the&nbsp;forward&nbsp;reference&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_prolog&nbsp;&nbsp;&nbsp;(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;jit_arg_ui&nbsp;&nbsp;&nbsp;();<BR><IMG id=Codehighlighter1_268_279_Open_Image onclick="this.style.display='none'; Codehighlighter1_268_279_Open_Text.style.display='none'; Codehighlighter1_268_279_Closed_Image.style.display='inline'; Codehighlighter1_268_279_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_268_279_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_268_279_Closed_Text.style.display='none'; Codehighlighter1_268_279_Open_Image.style.display='inline'; Codehighlighter1_268_279_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_getarg_ui(JIT_V0,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_268_279_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">/**/</SPAN><SPAN id=Codehighlighter1_268_279_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;V0&nbsp;=&nbsp;n&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">ref</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;jit_blti_ui&nbsp;&nbsp;(jit_forward(),&nbsp;JIT_V0,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_371_384_Open_Image onclick="this.style.display='none'; Codehighlighter1_371_384_Open_Text.style.display='none'; Codehighlighter1_371_384_Closed_Image.style.display='inline'; Codehighlighter1_371_384_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_371_384_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_371_384_Closed_Text.style.display='none'; Codehighlighter1_371_384_Open_Image.style.display='inline'; Codehighlighter1_371_384_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_subi_ui&nbsp;&nbsp;(JIT_V1,&nbsp;JIT_V0,&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_371_384_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">/**/</SPAN><SPAN id=Codehighlighter1_371_384_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;V1&nbsp;=&nbsp;n-1&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_429_442_Open_Image onclick="this.style.display='none'; Codehighlighter1_429_442_Open_Text.style.display='none'; Codehighlighter1_429_442_Closed_Image.style.display='inline'; Codehighlighter1_429_442_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_429_442_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_429_442_Closed_Text.style.display='none'; Codehighlighter1_429_442_Open_Image.style.display='inline'; Codehighlighter1_429_442_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_subi_ui&nbsp;&nbsp;(JIT_V2,&nbsp;JIT_V0,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_429_442_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">/**/</SPAN><SPAN id=Codehighlighter1_429_442_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;V2&nbsp;=&nbsp;n-2&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_prepare_i(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_pusharg_ui(JIT_V1);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_finish(nfibs);<BR><IMG id=Codehighlighter1_558_578_Open_Image onclick="this.style.display='none'; Codehighlighter1_558_578_Open_Text.style.display='none'; Codehighlighter1_558_578_Closed_Image.style.display='inline'; Codehighlighter1_558_578_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_558_578_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_558_578_Closed_Text.style.display='none'; Codehighlighter1_558_578_Open_Image.style.display='inline'; Codehighlighter1_558_578_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_retval_i&nbsp;(JIT_V1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_558_578_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">/**/</SPAN><SPAN id=Codehighlighter1_558_578_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;V1&nbsp;=&nbsp;nfibs(n-1)&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_prepare_i(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_pusharg_ui(JIT_V2);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_finish(nfibs);<BR><IMG id=Codehighlighter1_694_714_Open_Image onclick="this.style.display='none'; Codehighlighter1_694_714_Open_Text.style.display='none'; Codehighlighter1_694_714_Closed_Image.style.display='inline'; Codehighlighter1_694_714_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_694_714_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_694_714_Closed_Text.style.display='none'; Codehighlighter1_694_714_Open_Image.style.display='inline'; Codehighlighter1_694_714_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_retval_i&nbsp;(JIT_V2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_694_714_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">/**/</SPAN><SPAN id=Codehighlighter1_694_714_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;V2&nbsp;=&nbsp;nfibs(n-2)&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_addi_ui(JIT_V1,&nbsp;&nbsp;JIT_V1,&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_796_818_Open_Image onclick="this.style.display='none'; Codehighlighter1_796_818_Open_Text.style.display='none'; Codehighlighter1_796_818_Closed_Image.style.display='inline'; Codehighlighter1_796_818_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_796_818_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_796_818_Closed_Text.style.display='none'; Codehighlighter1_796_818_Open_Image.style.display='inline'; Codehighlighter1_796_818_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_addr_ui(JIT_RET,&nbsp;JIT_V1,&nbsp;JIT_V2);&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_796_818_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">/**/</SPAN><SPAN id=Codehighlighter1_796_818_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;RET&nbsp;=&nbsp;V1&nbsp;+&nbsp;V2&nbsp;+&nbsp;1&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_ret();<BR><IMG id=Codehighlighter1_880_895_Open_Image onclick="this.style.display='none'; Codehighlighter1_880_895_Open_Text.style.display='none'; Codehighlighter1_880_895_Closed_Image.style.display='inline'; Codehighlighter1_880_895_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_880_895_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_880_895_Closed_Text.style.display='none'; Codehighlighter1_880_895_Open_Image.style.display='inline'; Codehighlighter1_880_895_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>jit_patch(</SPAN><SPAN style="COLOR: #0000ff">ref</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_880_895_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">/**/</SPAN><SPAN id=Codehighlighter1_880_895_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;patch&nbsp;jump&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_940_952_Open_Image onclick="this.style.display='none'; Codehighlighter1_940_952_Open_Text.style.display='none'; Codehighlighter1_940_952_Closed_Image.style.display='inline'; Codehighlighter1_940_952_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_940_952_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_940_952_Closed_Text.style.display='none'; Codehighlighter1_940_952_Open_Image.style.display='inline'; Codehighlighter1_940_952_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_movi_i(JIT_RET,&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_940_952_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">/**/</SPAN><SPAN id=Codehighlighter1_940_952_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;RET&nbsp;=&nbsp;1&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jit_ret();<BR><IMG id=Codehighlighter1_968_1023_Open_Image onclick="this.style.display='none'; Codehighlighter1_968_1023_Open_Text.style.display='none'; Codehighlighter1_968_1023_Closed_Image.style.display='inline'; Codehighlighter1_968_1023_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_968_1023_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_968_1023_Closed_Text.style.display='none'; Codehighlighter1_968_1023_Open_Image.style.display='inline'; Codehighlighter1_968_1023_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_968_1023_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">/**/</SPAN><SPAN id=Codehighlighter1_968_1023_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">&nbsp;call&nbsp;the&nbsp;generated&nbsp;code,&nbsp;passing&nbsp;32&nbsp;as&nbsp;an&nbsp;argument&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>jit_flush_code(codeBuffer,&nbsp;jit_get_ip().ptr);</SPAN></DIV>
<P>froofyJIT:</P>
<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: #000000">typedef&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">pifi)(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>pifi&nbsp;nfibs;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_46_790_Open_Image onclick="this.style.display='none'; Codehighlighter1_46_790_Open_Text.style.display='none'; Codehighlighter1_46_790_Closed_Image.style.display='inline'; Codehighlighter1_46_790_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_46_790_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_46_790_Closed_Text.style.display='none'; Codehighlighter1_46_790_Open_Image.style.display='inline'; Codehighlighter1_46_790_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_46_790_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_46_790_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">namespace</SPAN><SPAN style="COLOR: #000000">&nbsp;froofy::jit;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label</SPAN><SPAN style="COLOR: #000000">&lt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;basis;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>nfibs</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">org,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codeBuffer;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prolog,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">arg</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getarg</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v0,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blti</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basis,&nbsp;v0,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subi</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1,&nbsp;v0,&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subi</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v2,&nbsp;v0,&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepare</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pusharg</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfibs;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retval</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepare</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pusharg</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v2;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finish,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfibs;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retval</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v2;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addi</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1,&nbsp;v1,&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">ui</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rr,&nbsp;v1,&nbsp;v2;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>basis</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;movi</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rr,&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">end,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codeBuffer;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV><BR>明显帅了很多。（不要问我这些代码的含义，我自己都还没有学会GNU Lightning，研究当中）<BR>不过GNU Lightning本身是不是正如他自己所说，能够达到嵌入式汇编同样的效率，小弟还没有具体测试过。另外，如果再加上一层C++，会不会增加消耗，那就只有研究过原代码才能确定了。这几天暂时还没有时间，迟点有结果再来写。<img src ="http://www.cppblog.com/cyt/aggbug/2910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-01-19 17:45 <a href="http://www.cppblog.com/cyt/archive/2006/01/19/2910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>epoll的安装和调试</title><link>http://www.cppblog.com/cyt/archive/2006/01/19/2907.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 19 Jan 2006 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/01/19/2907.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/2907.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/01/19/2907.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/2907.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/2907.html</trackback:ping><description><![CDATA[又是一件折腾了我一天的事情。其实epoll代码早就会写了，lib里面早就支持了epoll，但一直停留在“支持”阶段。实际上却是没有用起来过。公司装了一台机器，里面有epoll.h和epoll.a，但核心却不是2.6，所以机器上能编译但不能运行。另外一台机器升级了内核，但却怎么也找不到epoll.h和epoll.a。所以郁闷了很久，于是下定决心，要把这个问题搞个清楚。终于，在向东博士的帮助下，把问题解决了。<BR><BR>其实网上也有很多的介绍，例如 <A href="http://www.xmailserver.org/linux-patches/nio-improve.html">http://www.xmailserver.org/linux-patches/nio-improve.html</A>&nbsp;<BR>从网上下载了一个 <A href="http://www.xmailserver.org/linux-patches/epoll-lib-0.11.tar.gz">epoll-lib-0.11.tar.gz</A>&nbsp;，把它放到已经升级内核到2.6的Redhat9机器，解开。然后进去make，发现没有mkdep……也懒得管了，直接来一个：make lib/libepoll.a<BR>跳过了mkdep这一步，但还是出错：<BR>./src/epoll.c: In function `epoll_create':<BR>./src/epoll.c:28: error: `__NR_epoll_create' undeclared (first use in this function)<BR>./src/epoll.c:28: error: (Each undeclared identifier is reported only once<BR>./src/epoll.c:28: error: for each function it appears in.)<BR>./src/epoll.c: In function `epoll_ctl':<BR>./src/epoll.c:30: error: `__NR_epoll_ctl' undeclared (first use in this function)<BR>./src/epoll.c: In function `epoll_wait':<BR>./src/epoll.c:32: error: `__NR_epoll_wait' undeclared (first use in this function)<BR>百思不得其解……向东博士提说：把内核的源代码ln 到/usr/src/linux目录下。这才恍然大悟。于是：<BR>ln -s /usr/src/linux-2.6.14.2 /usr/src/linux<BR><BR>哈哈，这下编译通过了。赶快make install（其实我是自己手工把.h和.lib复制到相应目录，那些man的东西全部都不管了）。<BR><BR>然后就开始编译自己的代码了。谁知道到了链接这一步，又出问题了：<BR>/usr/lib/gcc/i686-pc-linux-gnu/4.0.2/../../../../i686-pc-linux-gnu/bin/ld: cannot find /lib/libpthread.so.0<BR>这是晕死，还以为是自己的gcc装错了，于是重新装了一次gcc。但还是出现同样的问题。<BR>又是向东博士提示：<BR>ln /lib/i686/libpthread-0.10.so /lib/libpthread.so.0<BR>链接也都通过了。<BR><BR>也未免高兴得太早，轮到运行出错了：<BR>/lib/libgcc_s.so.1: version `GCC_3.3' not found (required by /usr/lib/libstdc++.so.6)<BR>……这次不用别人提示了，马上到处找找哪里还有libgcc_s.so.1。于是我把/home/cyt/gcc-4.0.2/objdir/gcc/libgcc_s.so.1复制到了/lib下面。（其实就是我make gcc的那个目录下面找到的libgcc_s.so.1，其它地方都有的，不过我也懒得找了）。<BR>终于程序跑起来了……<BR><img src ="http://www.cppblog.com/cyt/aggbug/2907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-01-19 16:08 <a href="http://www.cppblog.com/cyt/archive/2006/01/19/2907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>drupal安装心得</title><link>http://www.cppblog.com/cyt/archive/2006/01/19/2904.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Thu, 19 Jan 2006 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2006/01/19/2904.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/2904.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2006/01/19/2904.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/2904.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/2904.html</trackback:ping><description><![CDATA[一转眼，原来发现自己两个月没有写blog，<IMG height=20 src="http://www.cppblog.com/Emoticons/QQ/11.gif" width=20 border=0>。其实这两个月做了很多东西，但细想却没有什么值得拿出来和大家分享。<BR><BR>前几天公司的bbs倒了，于是想重装一个类似于blog或者论坛之类的东西。由于IT的同事只熟悉PHP，于是到处找php的建站资源。后来nomad介绍drupal，Rayman也说这个不错，于是就尝试安装一个。网上的资料基本都是Linux下的安装过程介绍，几个rpm装好apache/mysql/php，三两下就可以装好。但现在要在Win下装，麻烦的事情多多。下面总结一下win下的安装过程：<BR><BR>首先找到一个叫wamp的东西，<A href="http://www.wampserver.com/index.php?lang=en">http://www.wampserver.com/index.php?lang=en</A>&nbsp;一个Windows下集成apache 2、mysql 5、php 5的安装包。里面还包括了phpmyadmin。其实类似的安装包很多很多，之所以选这个，是贪图他还有一个在tray的小控制工具：<BR><IMG src="http://www.wampserver.com/en/images/illu_menu.gif"><BR>可以方便控制apache和mysql的启动和停止，可以方便增加alias，对于我这种apache配置盲来说，最方便不过了。<BR><BR>三两下安装完以后，先进入PHPMyAdmin。（可以从tray那个小图标进去，或者直接用 <A href="http://localhost/phpmyadmin/">http://localhost/phpmyadmin/</A>&nbsp;进入）<BR>先把root的密码改了。然后……PHPMyAdmin就不能用了，呵呵。马上把 wamp\phpmyadmin\config.inc.php 里面的 $cfg['Servers'][$i]['password']的值改成刚才设置的密码。phpmyadmin就可以继续使用了。<BR><BR>然后就是下载drupal，从<A href="http://www.drupal.org/">www.drupal.org</A>可以找到最新版。把压缩包解开，例如我是放在 C:\drupal\下面。<BR><BR>然后又是用tray里面的 Alias directories -&gt; add an alias功能，增加一个影射。例如，我把<A href="http://hostname/drupal">drupal</A> 映射到C:\drupal\下面。（记得输入C:\drupal\ 后面的那个"\"，没有的话alias也能创建成功，但却是访问不到的）。<BR><BR>用phpmyadmin建立一个drupal的帐号，并且建立一个drupal的库，drupal帐号当然要设置成拥有drupal的所有访问权限了。这些在phpmyadmin很容易就解决了。然后又是麻烦的事情了。drupal没有使用mysqli，所以对mysql4.1以上的数据库访问会有问题。drupal自己给出了解决方案：<BR><A href="http://drupal.org/node/35226">http://drupal.org/node/35226</A>。于是只好按mysql自己说的<A href="http://dev.mysql.com/doc/refman/4.1/en/old-client.html">http://dev.mysql.com/doc/refman/4.1/en/old-client.html</A>，更改密码类型：<BR>set password for drupal = old_password('123456');<BR>flush privileges;<BR>然后找到wamp\mysql\my.ini，在[wampmysqld]下面加上一行：<BR>old-passwords<BR>然后用tray那个小工具重起一下mysql。<BR><BR>后面又是根据drupal的说明，step by step的时候。先把drupal\database\database.mysql导入到drupal这个数据库里面。然后把drupal\sites\default\settings.php里面的base_url和db_rul改了，例如我这里就是：<BR>$base_url = 'http://192.168.1.102/drupal';<BR>$db_url = 'mysql://drupal:123456@localhost/drupal';<BR><BR>然后就是在IE中打开 http://192.168.1.102/drupal/&nbsp; 了。麻烦事还是接踵而来。界面丑陋不堪，一堆<BR>{head} {styles} <BODY{ONLOAD_ATTRIBUTES}>
<TABLE id=header cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD id=logo>{_BLOCK_.header.logo} {_BLOCK_.header.site_name} </TD>
<TD id=menu>
<DIV id=secondary>{secondary_links}</DIV>
<DIV id=primary>{primary_links}</DIV></TD></TR></TBODY></TABLE>
<TABLE id=content cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>{_BLOCK_.header.blocks} 
<TD vAlign=top>
<DIV id=main>{_BLOCK_.header.title} {_BLOCK_.header.help} {_BLOCK_.header.message}</DIV></TD></TR></TBODY></TABLE>在页面上。不要着急，原因是用了php5.1。drupal也有解决方案。<BR><BR>先按 create first account，建立第一个管理员用户。然后当然是改管理员密码。这些都是在那个丑陋的界面上进行。当改完密码，界面显示上就一个链接都没有了。这时候重新输入 <A href="http://192.168.1.102/drupal/">http://192.168.1.102/drupal/</A> 又回到第一个丑陋的界面。<BR>先从drupal那里下载一个 phptemplate的template engien（<A href="http://drupal.org/project/Theme%20engines">http://drupal.org/project/Theme%20engines</A>），把它解压到 drupal\themes\engines下面，和xtemplate并排。然后再下载几个支持phptemplate的主题，例如 <A href="http://drupal.org/project/argeebee">argeebee</A>、<A href="http://drupal.org/project/bidi-theme">BiDi</A> 等等。把这些主题都解开放到drupal\themes下面。然后在那个丑陋界面上选择按 Themes 那个连接进去，然后选择刚才下载的支持 phptemplate的那些主题。<BR><BR>好了，从我的角度来说工作就完成了，额外奉送下载几个插件和主题装上去，然后还import了一个中文的本地化文件，让界面变成中文。余下就是管理员自己的事情了，要怎么折腾、要有什么创意都变得与我无关……要改程序？自己慢慢看PHP吧。<BR><img src ="http://www.cppblog.com/cyt/aggbug/2904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2006-01-19 15:37 <a href="http://www.cppblog.com/cyt/archive/2006/01/19/2904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用std::vector的一个误区</title><link>http://www.cppblog.com/cyt/archive/2005/11/09/1010.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Wed, 09 Nov 2005 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/11/09/1010.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/1010.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/11/09/1010.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/1010.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/1010.html</trackback:ping><description><![CDATA[借助valgrind，终于找到一个隐藏很久的bug：<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">class</SPAN><SPAN style="COLOR: #000000"> A<BR><IMG id=Codehighlighter1_8_21_Open_Image onclick="this.style.display='none'; Codehighlighter1_8_21_Open_Text.style.display='none'; Codehighlighter1_8_21_Closed_Image.style.display='inline'; Codehighlighter1_8_21_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_8_21_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_21_Closed_Text.style.display='none'; Codehighlighter1_8_21_Open_Image.style.display='inline'; Codehighlighter1_8_21_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_8_21_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_8_21_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>    <IMG src="http://www.cppblog.com/images/dot.gif"><IMG src="http://www.cppblog.com/images/dot.gif"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>std::vector</SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000">A</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000">  vecArray;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>vecArray.push_back( <IMG src="http://www.cppblog.com/images/dot.gif"> );<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>vecArray.push_back( <IMG src="http://www.cppblog.com/images/dot.gif"> );<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>vecArray.push_back( <IMG src="http://www.cppblog.com/images/dot.gif"> );<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>A </SPAN><SPAN style="COLOR: #000000">&</SPAN><SPAN style="COLOR: #000000"> a</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> vecArray.back();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>vecArray.push_back( <IMG src="http://www.cppblog.com/images/dot.gif"> );<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><IMG src="http://www.cppblog.com/images/dot.gif"><IMG src="http://www.cppblog.com/images/dot.gif"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>以上的代码骤眼看上去也没有什么奇怪的地方，经过多次的测试也没有发现什么问题。但昨天bug终于爆发了，程序总是无缘无故down掉。<BR>其实原因很简单，就是在 A & a = vecArray.back(); 这一步。<BR>vector是一个会自增长的容器，自增长的结果就是把原来的内存释放掉，重新分配一个足够大的内存。既然原来的内存已经释放掉，那么a所引用的内存就是一段无效的内存。对无效内存的访问，后果有多严重就不用多说了。<BR><BR>想解决方法也很多，最简单就是用std::list或者std::deque替代vector。<img src ="http://www.cppblog.com/cyt/aggbug/1010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-11-09 15:22 <a href="http://www.cppblog.com/cyt/archive/2005/11/09/1010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>补充 BVRDE 使用的一些注意问题</title><link>http://www.cppblog.com/cyt/archive/2005/10/14/680.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Fri, 14 Oct 2005 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/14/680.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/680.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/14/680.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/680.html</trackback:ping><description><![CDATA[BVRDE 会自动生成Makefile，并把project中的cpp自动加到Makefile中。<BR>如果是build debug版本的时候，它会在make之前会执行一个export DEBUG_OPTIONS="-g -D_DEBUG"，但由于个人比较喜欢tcsh，所以这个export在tcsh下并不生效，所以必须要在Solution Explorer那里选择project的properties，然后在Compiler-&gt;Commands-&gt;Compiler Directives那里改一下设置。<BR>另外，自动生成的Makefile里面自动加上-O参数，但这个-O参数会影响Debug时候程序代码的定位，所以还是手工去掉。一劳永逸的方法是去program files\BVRDE\Templates\Wizards\下面把makefile.txt下改一下。另外，clean的时候出了要rm core以外，在linux下还应该加上core.*。<img src ="http://www.cppblog.com/cyt/aggbug/680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-14 15:21 <a href="http://www.cppblog.com/cyt/archive/2005/10/14/680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个远程Debug Linux/Unix下进程的工具（不是那个Magic xxxx）</title><link>http://www.cppblog.com/cyt/archive/2005/10/12/662.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Wed, 12 Oct 2005 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/12/662.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/662.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/12/662.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/662.html</trackback:ping><description><![CDATA[<P>曾几何时国产软件 Magic xxxx 也算是振奋人心的一个软件，可以远程开发和Debug。使用过一下早期的版本，效果未如理想。后来据说有长足的发展，但已经变成了一个收费软件了。<BR><BR>昨天在找WTL的sample的时候，发现有一个 <A href="http://www.viksoe.dk/">http://www.viksoe.dk/</A>&nbsp;，里面比较多好的WTL的控件。<BR>其中，里面提到一个 <A href="http://bvrde.sourceforge.net/">http://bvrde.sourceforge.net/</A>&nbsp; 一个免费的远程Debug工具。下载并试了一下，感觉还不错。<BR>BVRDE不需要像Magic xxxx那样安装服务器端。他只需要正确地设置ftp/sftp、telnet/ssh等参数，就能正确进行远程的程序开发和调试。<BR>调试的功能也比较强，基本上常用的功能都有：<BR><BR><IMG height=572 alt=BVRDE_UI.GIF src="http://www.cppblog.com/images/cppblog_com/cyt/cpp/BVRDE_UI.GIF" width=1009 border=0><BR><BR><BR>另外，它还支持cvs/svn等版本控制；有一定的Auto-Suggestion和Auto-Completion的能力。<BR><BR>毕竟这个是一个免费的软件，还是存在不少的Bug，例如不能自动生成标准库的TAG（即不能对标准库实现Auto-Suggestion和Auto-Completion）、窗口位置不能保存……另外也有很多地方不够人性化……不过也算是基本能用了。<BR><BR></P><img src ="http://www.cppblog.com/cyt/aggbug/662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-12 16:34 <a href="http://www.cppblog.com/cyt/archive/2005/10/12/662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的RMI之我想</title><link>http://www.cppblog.com/cyt/archive/2005/10/08/594.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Sat, 08 Oct 2005 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/08/594.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/594.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/08/594.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/594.html</trackback:ping><description><![CDATA[刚刚搬来这个温暖的C++大家庭，就已经发现有高手在开发C++的RMI了。<BR><BR>我一直都在留意<A href="http://www.codeproject.com">www.codeproject.com</A>的一个项目：<A href="http://www.codeproject.com/threads/RMI_For_Cpp.asp">http://www.codeproject.com/threads/RMI_For_Cpp.asp</A><BR>作者并在不断的完善中，但也基本上能用了。<BR>calvin前几天又提醒过我一次，一个久违的project：<A href="http://acdk.sourceforge.net/">http://acdk.sourceforge.net/</A>&nbsp;里面也实现了类似的RMI技术。（当然是模仿Java的RMI，而且模仿得很像）。<BR><BR>个人比较讨厌类似于ICE那种，需要通过一个外部工具编译IDL的做法，不利于集成开发：老要在IDE上做些手脚，以实现自动预编译；要找相应的语法解释器解释IDL，否则编辑困难；由于不是源代码的一部分，代码管理上经常会有些混乱……所以反而比较喜欢类似于RMI for c++这种，把接口的描述也作为源代码的一部分。而且由于都是C++语言的一部分，不会有太多的额外工作。<BR><BR>但在本人的实际工作中，RMI却不如想象中这么有效。<BR>首先，就是参数传递。很多情况下，调用一个函数，会传入一些参数。既然是面向对象开发，传入一个对象的情况是不可避免的。例如：<BR>int func(TMyObject &amp; a);<BR>TMyObject可能是一个很庞大，很复杂的类，但func里面可能只需要访问其中80%的成员变量。但是只通过IDL的接口，不可能知道究竟函数里面需要哪些数据，所以一般根据IDL生成的辅助代码，都会是把整个TMyObject对象序列化并传递。当TMyObject相当庞大的时候，这个浪费相当厉害。更好的做法只好把func所需要的参数逐个排列出来作为func的参数。但这样func用起来就变得极为麻烦了。<BR>其次就是数据流的处理问题。经常会出现类似于int func(stream &amp; a, stream &amp; b);的函数调用。对于客户端，缺省的实现容易理解，按顺序把两个stream中的数据序列化就可以了。但是在服务器端，代码就没有这么好写了。由于stream一般都是一个虚类，因此IDL生成的辅助代码就要想办法用一种具体stream子类，把网络数据先收下来，然后再传给实际的func函数。而这个stream的子类也比较头疼，应该选内存还是临时文件呢？还是更智能一点，小数据内存、大数据文件呢？但无论是哪种方法，都要考虑数据的回收和生存期的问题。另外不爽的地方就是数据要接收完毕才能真正执行func，从而数据是多拷贝了一次了。<BR><BR>当然这里所说的问题对于一般应用都无关痛痒，但对于一些性能要求比较高的场合，RMI自动生成的stub就无能为力了。<BR>RMI往往也和反射、成员序列化等技术相关。而且通常还要涉及到通讯版本差异处理、异常处理等等。像ICE还增加了异步处理、对象发现等等。所以要做一个完整的RMI，的确不是容易的事情。<BR><img src ="http://www.cppblog.com/cyt/aggbug/594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-08 17:24 <a href="http://www.cppblog.com/cyt/archive/2005/10/08/594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的一些应用技巧备忘</title><link>http://www.cppblog.com/cyt/archive/2005/10/08/590.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Sat, 08 Oct 2005 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/08/590.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/590.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/08/590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/590.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/590.html</trackback:ping><description><![CDATA[<P>今天用Shell script做一个安装包，其中需要用SQLPlus做一些数据库初始化处理。其中碰上两个问题：</P>
<P>1、&amp;的转义<BR>&nbsp;&nbsp;&nbsp; 以前一直都不知道，原来在SQLPlus中，&amp;的含义是让用户输入参数。<BR>例如：insert into my_table values('0=0&amp;1=0&amp;2=0');<BR>执行SQLPlus的时候，就会提示：<BR>Enter value for 1: abc<BR>Enter value for 2: efg<BR>然后实际插入的结果是：<BR>insert into my_table values('0=0abc=0efg=0');<BR>&nbsp;&nbsp;&nbsp; 要去掉这个功能有两种实现方法：<BR>&nbsp;&nbsp;&nbsp; A、用转义字符：在QQ群友e点的帮助下，找到下面这段话：<BR>SQLPLUS recognizes the '&amp;' "and" character as a substitution character for data input. <BR>So to store a string such as "Johnson &amp; Son" into an Oracle table, use an escape character, as in 'Johnson \&amp; Son' (with the \&amp;). <BR><BR>But first turn on escape character processing: <BR><BR>SQL&gt; set escape \&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; B、更简单，关闭这个功能就行了：<BR>SET DEFINE OFF;<BR>Use SET DEFINE OFF to prevent scanning for the substitution character. Reference: bug 13199 <BR></P>
<P>2、md5<BR>&nbsp;&nbsp;&nbsp; 其实应该不算是奇怪问题，由于shell scrip调用的一批初始化数据库数据的SQL语句想在mysql和Oracle之间通用，即不想mysql中管理一份，oracle中管理一份。其实语句大部分都是相同，但唯独有个初始化管理员密码的SQL语句碰上麻烦。密码是md5加密的，插入mysql的时候可以使用mysql的md5函数，但是Oracle没有同名的函数。网上google一把，很多解决方案，但试了几个都不行。后来综合了几个的做法，最终得出一个结果：<BR>CREATE OR REPLACE FUNCTION md5(passwd IN VARCHAR2) RETURN VARCHAR2<BR>IS<BR>&nbsp;retval varchar2(32);<BR>BEGIN<BR>&nbsp;retval := lower( utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING =&gt; passwd)) );<BR>&nbsp;RETURN retval;<BR>END;<BR></P><img src ="http://www.cppblog.com/cyt/aggbug/590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-08 14:50 <a href="http://www.cppblog.com/cyt/archive/2005/10/08/590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>g++ 3.4.3</title><link>http://www.cppblog.com/cyt/archive/2005/10/08/585.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Sat, 08 Oct 2005 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/08/585.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/585.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/08/585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/585.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/585.html</trackback:ping><description><![CDATA[<P>近来公司的事情比较多，都没有时间来blog写写东西了。</P>
<P>近来公司其中一个项目需要程序在g++ 3.4.3下编译，而源代码在g++ 3.2.3下面一个Warning都没有，但是在3.4.3下则一堆Error了。后来发现原来g++ 3.4.3严格了很多。其中“出问题”最多的是这种情况：</P>
<P><FONT color=#3300ff>class TObjBase<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp; TObjBase(void) : m_nVal(0) {}<BR>&nbsp;&nbsp;&nbsp; ~TObjBase(void) {}<BR><BR>&nbsp;&nbsp;&nbsp; int getVal(void) const { return m_nVal; }<BR>&nbsp;&nbsp;&nbsp; void setVal(int n) { m_nVal = n; }<BR>protected:<BR>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; m_nVal;<BR>};<BR><BR>template&lt;class typeObj&gt;<BR>class TExtObj : public typeObj<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp; TExtObj(void) : typeObj() {}<BR><BR>&nbsp;&nbsp;&nbsp; int getExtVal(void) const { return getVal() + 100; }<BR>};</FONT></P>
<P>这是一种比较常见的应用，Adapter和Decorator模式都会用到这种技术。但问题在于g++ 3.4.3却说int getExtVal(void) const { return getVal() + 100; }这一行错误，getVal()找不到。</P>
<P>的确，单以TExtObj这个类看来，怎么也是找不到getVal()的定义在哪里。g++ 3.2.3以及VC6、VC7等，均以十分相信开发者的态度猜测这个函数必定在其他地方定义了，有可能是外部独立的函数、有可能是typeObj的成员函数。但g++ 3.4.3却非要程序员很负责任的告诉编译器，究竟是哪一个getVal()，于是解决方法：<BR>方法一：<BR><FONT color=#3300ff>int getExtVal(void) const { return typeObj::getVal() + 100; }</FONT></P>
<P>或者</P>
<P><BR>方法二：<BR><FONT color=#3300ff>int getExtVal(void) const { return this-&gt;getVal() + 100; }</FONT></P>
<P>当然，如果是外部的独立函数，那就是：</P>
<P><FONT color=#3300ff>int getExtVal(void) const { return ::getVal() + 100; }</FONT></P>
<P>然而，在getVal()是虚函数的时候，方法一和方法二是有区别的，这个是需要十分小心的事情。方法一是无论什么时候都会调用typeObj的getVal()，方法二是调用当前类最适合的虚函数getVal()。<BR></P><img src ="http://www.cppblog.com/cyt/aggbug/585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-08 14:45 <a href="http://www.cppblog.com/cyt/archive/2005/10/08/585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异步方式数据结构I/O</title><link>http://www.cppblog.com/cyt/archive/2005/10/08/583.html</link><dc:creator>cyt</dc:creator><author>cyt</author><pubDate>Sat, 08 Oct 2005 06:44:00 GMT</pubDate><guid>http://www.cppblog.com/cyt/archive/2005/10/08/583.html</guid><wfw:comment>http://www.cppblog.com/cyt/comments/583.html</wfw:comment><comments>http://www.cppblog.com/cyt/archive/2005/10/08/583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cyt/comments/commentRss/583.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cyt/services/trackbacks/583.html</trackback:ping><description><![CDATA[<P>以前一直都是做同步方式的数据结构存储。即典型的：<BR>void&nbsp; TMyClass::onSave(TStorage &amp; s)<BR>{<BR>&nbsp;&nbsp;&nbsp; s &lt;&lt; member1;<BR>&nbsp;&nbsp;&nbsp; s &lt;&lt; member2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<BR>}</P>
<P>void&nbsp; TMyClass::onLoad(TStorage &amp; s)<BR>{<BR>&nbsp;&nbsp;&nbsp; s &gt;&gt; member1;<BR>&nbsp;&nbsp;&nbsp; s &gt;&gt; member2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<BR>}<BR>假如s满了（Save的时候）或者s数据不足（Load的时候），函数会等待，直到s可用或者出错退出。相当于进程的Stack帮我们保存了I/O状态的上下文。</P>
<P>但是现在要转到异步方式I/O，当s“不可用”的时候，线程应该中断当前的操作，把I/O状态的上下文保存下来，转而做其他的操作。<BR>所以麻烦就来了，要自己做这个上下文的保存。一般来说要记录以下的内容：</P>
<P>1、操作到哪一个成员。<BR>2、假如成员是一个普通的类型、那就要记录操作到类型的哪一个byte。<BR>2、如果成员是一个复合类型，同样，递归地回到了1。</P>
<P>因此，上下文保存的结果一般都是一个自己做的stack，里面就是记录这个递归的过程。</P>
<P>其实想想，何苦为了省那几十k的空间折磨自己呢，例如输出，先用同步的方式把数据记录在内存，然后就记录内存的起始地址和长度，异步处理的时候就把内存输出，如果没有输出完的，就记下未输出部分的起始地址和长度，等待下一次。<BR>不过当结果比较庞大的时候，还是需要自己慢慢苦干，真是悲惨……</P><img src ="http://www.cppblog.com/cyt/aggbug/583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cyt/" target="_blank">cyt</a> 2005-10-08 14:44 <a href="http://www.cppblog.com/cyt/archive/2005/10/08/583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>