﻿<?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++博客-aurain-随笔分类-c/c++基础知识</title><link>http://www.cppblog.com/aurain/category/6208.html</link><description>专注Windows下的驱动开发、网络开发</description><language>zh-cn</language><lastBuildDate>Wed, 16 Apr 2014 06:22:13 GMT</lastBuildDate><pubDate>Wed, 16 Apr 2014 06:22:13 GMT</pubDate><ttl>60</ttl><item><title>C++类构造函数初始化列表及函数内赋值比较</title><link>http://www.cppblog.com/aurain/archive/2014/04/15/206595.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Tue, 15 Apr 2014 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2014/04/15/206595.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/206595.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2014/04/15/206595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/206595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/206595.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: c++类构造函数成员变量初始化列表及赋值比较&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2014/04/15/206595.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/206595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2014-04-15 15:53 <a href="http://www.cppblog.com/aurain/archive/2014/04/15/206595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++类中数据成员为类类型时，定义为对象还是定义为指针？</title><link>http://www.cppblog.com/aurain/archive/2012/11/18/195327.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Sun, 18 Nov 2012 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2012/11/18/195327.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/195327.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2012/11/18/195327.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/195327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/195327.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++类中数据成员为类类型时，定义为对象还是定义为指针？<br>一般来说，可以定义为对象，在如下情况考虑把数据成员定义成指针，<br>1）有多态的情况；会用到虚函数，基类指针<br>2）可能和别的类共享，或者只是引用别的类里的某个对象，所以生命周期不是很确定（这个可以考虑智能指针）<br>3）大数据类，如果定义成对象，会导致当前对象无法在栈内创建<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2012/11/18/195327.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/195327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2012-11-18 21:52 <a href="http://www.cppblog.com/aurain/archive/2012/11/18/195327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++数组分配</title><link>http://www.cppblog.com/aurain/archive/2011/06/29/149702.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Wed, 29 Jun 2011 00:47:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2011/06/29/149702.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/149702.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2011/06/29/149702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/149702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/149702.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在C++中，分配和归还内存时需要保持数组和非数组形式的操作符的匹配：<br>	T *aT = new T;	// 非数组<br>T *arrT = new T[16];	// 数组<br>delete aT;	// 非数组<br>delete [] arrT;	// 数组<br>aT = new T[1];	// 数组<br>delete aT;	// 错误！应该采用数组形式的操作符<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2011/06/29/149702.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/149702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2011-06-29 08:47 <a href="http://www.cppblog.com/aurain/archive/2011/06/29/149702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL函数对象</title><link>http://www.cppblog.com/aurain/archive/2011/06/29/149701.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Wed, 29 Jun 2011 00:46:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2011/06/29/149701.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/149701.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2011/06/29/149701.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/149701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/149701.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: STL不但使我们能够更轻松、更快捷地编写复杂的代码，而且使编写的代码既标准又高度优化。<br>std::vector<std::string> names;<br>// ...<br>std::sort(names.begin(), names.end());<br>STL另一个优雅之处在于高度可配置。在以上的代码中，使用string的小于（<）操作符对vector中的string元素进行排序，但在其它场合，未必总有一个小于操作符可供使用，而且有时并不希望以升序方式进行排序。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2011/06/29/149701.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/149701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2011-06-29 08:46 <a href="http://www.cppblog.com/aurain/archive/2011/06/29/149701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C/C++指针的两个要点</title><link>http://www.cppblog.com/aurain/archive/2011/03/24/142652.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Thu, 24 Mar 2011 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2011/03/24/142652.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/142652.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2011/03/24/142652.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/142652.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/142652.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. 指向常量的指针和常量指针<br>2. 指向指针的指针<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2011/03/24/142652.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/142652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2011-03-24 16:10 <a href="http://www.cppblog.com/aurain/archive/2011/03/24/142652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>glib库中的哈希函数和比较函数</title><link>http://www.cppblog.com/aurain/archive/2010/07/06/119463.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Tue, 06 Jul 2010 09:43:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2010/07/06/119463.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/119463.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2010/07/06/119463.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/119463.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/119463.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近在项目中需要用到哈希表，要以ip地址构造哈希函数和比较函数。就去网上找了下相关的资料，看了下glib中哈希表中的实现方式，虽然最终没用这个，但既然找了就顺便记录下来，方便查阅。<br>哈希表是一种提供key-value访问的数据结构，通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典，通过单词的首字母能够快速的找到单词。关于哈希表的详细介绍请查阅数据结构的相关书籍，我这里只介绍glib库中哈希表的哈希函数和比较函数。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2010/07/06/119463.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/119463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2010-07-06 17:43 <a href="http://www.cppblog.com/aurain/archive/2010/07/06/119463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux在终端模式显示进度</title><link>http://www.cppblog.com/aurain/archive/2008/12/05/68633.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Fri, 05 Dec 2008 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/12/05/68633.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/68633.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/12/05/68633.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/68633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/68633.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在传输文件的时候，为了显示传输的进度，需要在一行不停的变换数字显示，找了些资料，发现原来可以很简单的实现&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2008/12/05/68633.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/68633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-12-05 11:28 <a href="http://www.cppblog.com/aurain/archive/2008/12/05/68633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运算符的优先级与结合</title><link>http://www.cppblog.com/aurain/archive/2008/08/25/59898.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Mon, 25 Aug 2008 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/08/25/59898.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/59898.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/08/25/59898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/59898.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/59898.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 运算符的优先级与结合&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2008/08/25/59898.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/59898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-08-25 13:49 <a href="http://www.cppblog.com/aurain/archive/2008/08/25/59898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Base64编码解码</title><link>http://www.cppblog.com/aurain/archive/2008/07/01/55016.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Tue, 01 Jul 2008 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/07/01/55016.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/55016.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/07/01/55016.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/55016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/55016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用Base64编码解码字符串、文件&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2008/07/01/55016.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/55016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-07-01 11:02 <a href="http://www.cppblog.com/aurain/archive/2008/07/01/55016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Inno Setup制作的安装包中利用Pascal脚本检查安装，卸载前检查程序是否已经启动。</title><link>http://www.cppblog.com/aurain/archive/2008/06/12/53019.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Thu, 12 Jun 2008 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/06/12/53019.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/53019.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/06/12/53019.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/53019.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/53019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: IS(Inno Setup，我用的是5.2.2)是一款免费的制作安装包的工具，关于它的具体介绍和如何制作安装包（用向导一步一步很容易上手的）我就不介绍了。在这里，只介绍两个方面的内容：<br><br>1. 安装软件前，检查该软件是否正在运行，如果正在运行，则提示用户，需要先关闭，然后才能进一步按照。<br><br>2. 卸载软件的时候，检查该软件是否正在运行，如果正在运行，则要关闭才能进行卸载。<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2008/06/12/53019.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/53019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-06-12 15:25 <a href="http://www.cppblog.com/aurain/archive/2008/06/12/53019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见笔试题</title><link>http://www.cppblog.com/aurain/archive/2008/06/10/52719.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Tue, 10 Jun 2008 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/06/10/52719.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/52719.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/06/10/52719.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/52719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/52719.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 常见的c/c++笔试题&nbsp;&nbsp;<a href='http://www.cppblog.com/aurain/archive/2008/06/10/52719.html'>阅读全文</a><img src ="http://www.cppblog.com/aurain/aggbug/52719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-06-10 10:20 <a href="http://www.cppblog.com/aurain/archive/2008/06/10/52719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链接时如何选择C Run-Time(CRT) library </title><link>http://www.cppblog.com/aurain/archive/2008/04/23/47911.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Wed, 23 Apr 2008 06:31:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/04/23/47911.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/47911.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/04/23/47911.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/47911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/47911.html</trackback:ping><description><![CDATA[<p>在Windows下有六种类型CRTLib(C运行库）:<br>Reusable Library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Switch&nbsp;&nbsp;&nbsp; Library&nbsp;&nbsp;&nbsp; Macro(s) Defined<br>----------------------------------------------------------------<br>Single Threaded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ML&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(none)<br>Static MultiThread&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/MT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBCMT&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;_MT<br>Dynamic Link (DLL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /MD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSVCRT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_MT and _DLL<br>Debug Single Threaded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /MLd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;_DEBUG<br>Debug Static MultiThread&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /MTd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBCMTD&nbsp;&nbsp;&nbsp; _DEBUG and _MT<br>Debug Dynamic Link (DLL)&nbsp;&nbsp;&nbsp; /MDd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSVCRTD&nbsp;&nbsp;&nbsp; _DEBUG, _MT, and _DLL</p>
<p>MT和MD都适用于多线程，其区别是：<br>MT为静态链接CRT，这样编译出来exe是自包含的，所以会相对大一些，但运行时不用再load CRT库。<br>MD为动态链接CRT，编译出来exe会小一些，运行时需要load CRT，性能有一点点损失。</p>
<p>任何工程都应该使用同样的CRT Library。即要么都是/ML，要么都是/MTD, 如此类推。</p>
<p>如果一个程序中混合使用不同类型的CRT，有时可以通过link，这样会存在不同CRT的copy，并导致以下问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;1）在一个lib中new出来内存，在另一个lib中delete，会crash。<br>&nbsp;&nbsp;&nbsp;&nbsp;2）不能在多个lib中共享file handle。<br>&nbsp;&nbsp;&nbsp; 3）一个lib中设置locale（本地化有关），不能在另一个lib中起作用。</p>
<p>当工程比较大，包含的lib很多，特别当有外部lib（Third party&nbsp;library）存在时，link很容易发生下面这样的错误。<br>LIBCMTD.lib(chsize.obj) : error LNK2005: __chsize already defined in MSVCRTD.lib(MSVCRTD.dll)<br>这说明，你的工程使用了不同类型的CRT。这个时候首先一定要坚信这个原则：整个工程用同样的CRT Lib就可以解决问题。然后耐心一一检查每个lib。<br>如果恰恰某个外部lib用MT，另一个用MD，这个时候就比较痛苦。<br>&nbsp;&nbsp;&nbsp;&nbsp;如果有他们源码，就编译一个MT or MD类型的lib，以统一使用一个类型CRT。<br>&nbsp;&nbsp;&nbsp;&nbsp;如果没有，那可能只好选择其他的lib。</p>
<p>一般，我个人习惯将所有lib都编译为MT。出于其他需要，会同时提供MT(MTd)和MD(MDd)两种版本。</p>
<img src ="http://www.cppblog.com/aurain/aggbug/47911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-04-23 14:31 <a href="http://www.cppblog.com/aurain/archive/2008/04/23/47911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcpy与strcpy实现</title><link>http://www.cppblog.com/aurain/archive/2008/04/22/47796.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Tue, 22 Apr 2008 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/04/22/47796.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/47796.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/04/22/47796.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/47796.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/47796.html</trackback:ping><description><![CDATA[<p>void* memcpy(void* pvTo, const void* pvForm, size_t size)<br>{<br>&nbsp;assert((pvTo!= NULL) &amp;&amp; (pvFrom!= NULL));//使用断言防止传递空地址<br>&nbsp;unsigned char* pbTo = (unsigned char*)pvTo;//防止改变pvTo的地址<br>&nbsp;unsigned char* pbFrom = (unsigned char*)pvFrom;//防止改变pvFrom的地址<br>&nbsp;while(size-- &gt; 0)<br>&nbsp;{<br>&nbsp;&nbsp;*pbTo++ = *pbFrom++;<br>&nbsp;}<br>&nbsp;return pvTo;<br>}</p>
<p>char* strcpy(char* pDest, const char* pSrc)<br>{<br>&nbsp;assert((pDest != NULL) &amp;&amp; (pSrc != NULL));<br>&nbsp;char *pTmp = pDest;<br>&nbsp;while ((*pDest++ = *pSrc++) != '\0')<br>&nbsp;&nbsp;;<br>&nbsp;return pTmp;<br>}</p>
<img src ="http://www.cppblog.com/aurain/aggbug/47796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-04-22 09:51 <a href="http://www.cppblog.com/aurain/archive/2008/04/22/47796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软c标准库中字符串操作源代码</title><link>http://www.cppblog.com/aurain/archive/2008/03/27/45492.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Thu, 27 Mar 2008 01:47:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/03/27/45492.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/45492.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/03/27/45492.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/45492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/45492.html</trackback:ping><description><![CDATA[<p>最近查看了微软的c标准库针对字符串操作的部分源代码，整理了一下放上来<br>char * strcat(char * dst, const char * src)<br>{<br>&nbsp;char * cp = dst;<br>&nbsp;<br>&nbsp;while(*cp)<br>&nbsp;{<br>&nbsp;&nbsp;cp++;&nbsp;&nbsp;/* find end of dst */<br>&nbsp;}<br>&nbsp;<br>&nbsp;while (*cp++ = *src++);&nbsp;/* Copy src to end of dst */<br>&nbsp;<br>&nbsp;return dst;&nbsp;/* return dst */<br>}</p>
<p>char * strcpy(char * dst, const char * src)<br>{<br>&nbsp;char * cp = dst;<br>&nbsp;<br>&nbsp;while (*cp++ = *src++);&nbsp; /* Copy src over dst */<br>&nbsp;<br>&nbsp;return dst;<br>}</p>
<p>char * strchr(const char * string, int ch)<br>{<br>&nbsp;while (*string &amp;&amp; *string != (char)ch)<br>&nbsp;{<br>&nbsp;&nbsp;string++;<br>&nbsp;}<br>&nbsp;<br>&nbsp;if (*string&nbsp; == (char)ch;<br>&nbsp;&nbsp;return (char *)string;<br>&nbsp;<br>&nbsp;return NULL;<br>}</p>
<p>int strcmp(const char * src, const char * dst)<br>{<br>&nbsp;int ret = 0;<br>&nbsp;<br>&nbsp;while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) &amp;&amp; *dst)<br>&nbsp;&nbsp;++src, ++dst;<br>&nbsp;&nbsp;<br>&nbsp;if ( ret &lt; 0 )<br>&nbsp; &nbsp;ret = -1 ;<br>&nbsp; else if ( ret &gt; 0 )<br>&nbsp; &nbsp;ret = 1 ;</p>
<p>&nbsp; return( ret );<br>}</p>
<p>size_t strlen(const char * str)<br>{<br>&nbsp;const char * eos = str;<br>&nbsp;<br>&nbsp;while (*eos++);<br>&nbsp;<br>&nbsp;return (int)(eos - str - 1);<br>}</p>
<p>char * strstr(const char * str1, const char * str2)<br>{<br>&nbsp;char * cp = (char *)str1;<br>&nbsp;char *s1, *s2;<br>&nbsp;<br>&nbsp;if (!*str2)<br>&nbsp;&nbsp;return (char *)str1;<br>&nbsp;<br>&nbsp;while (*cp)<br>&nbsp;{<br>&nbsp;&nbsp;s1 = cp;<br>&nbsp;&nbsp;s2 = str2;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;while (*s1 &amp;&amp; *s2 &amp;&amp; !(*s1-*s2))<br>&nbsp;&nbsp;&nbsp;s1++, s2++;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;while (!*s2)<br>&nbsp;&nbsp;&nbsp;return cp;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;cp++;<br>&nbsp;}<br>&nbsp;<br>&nbsp;return NULL;<br>}</p>
<img src ="http://www.cppblog.com/aurain/aggbug/45492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-03-27 09:47 <a href="http://www.cppblog.com/aurain/archive/2008/03/27/45492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows中定时操作(SetTimer函数用法)</title><link>http://www.cppblog.com/aurain/archive/2008/03/03/43589.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Mon, 03 Mar 2008 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/03/03/43589.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/43589.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/03/03/43589.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/43589.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/43589.html</trackback:ping><description><![CDATA[<p style="COLOR: #000080">最近需要在服务端定时执行某个操作，于是需要用到SetTimer函数。当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器的方法比较简单，通常告诉WINDOWS一个时间间隔，然后WINDOWS以此时间间隔周期性触发程序。</p>
<p style="COLOR: #000080">先请看SetTimer这个API函数的原型 </p>
<p style="COLOR: #000080">UINT_PTR SetTimer(<br>&nbsp; HWND hWnd,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 窗口句柄<br>&nbsp; UINT_PTR nIDEvent,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定时器ID，多个定时器时，可以通过该ID判断是哪个定时器<br>&nbsp; UINT uElapse,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 时间间隔,单位为毫秒<br>&nbsp; TIMERPROC lpTimerFunc&nbsp;&nbsp; // 回调函数<br>);</p>
<p style="COLOR: #000080">例如 <br>SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器<br>在MFC程序中SetTimer被封装在CWnd类中，调用就不用指定窗口句柄了</p>
<p style="COLOR: #000080">于是SetTimer函数的原型变为： </p>
<p style="COLOR: #000080">UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) </p>
<p style="COLOR: #000080">当使用SetTimer函数的时候，就会生成一个计时器。函数中nIDEvent指的是计时器的标识，也就是名字。nElapse指的是时间间隔，也就是每隔多长时间触发一次事件。第三个参数是一个回调函数，在这个函数里，放入你想要做的事情的代码，你可以将它设定为NULL，也就是使用系统默认的回调函数，系统默认认的是onTime函数。这个函数怎么生成的呢？你需要在需要计时器的类的生成onTime函数：在ClassWizard里，选择需要计时器的类，添加WM_TIME消息映射，就自动生成onTime函数了。然后在函数里添加代码，让代码实现功能。每隔一段时间就会自动执行一次。 </p>
<p style="COLOR: #000080">例： </p>
<p style="COLOR: #000080">SetTimer(1,1000,NULL); </p>
<p style="COLOR: #000080">1：计时器的名称； </p>
<p style="COLOR: #000080">1000：时间间隔，单位是毫秒； </p>
<p style="COLOR: #000080">NULL：使用onTime函数。 </p>
<p style="COLOR: #000080">当不需要计时器的时候调用KillTimer(nIDEvent); </p>
<p style="COLOR: #000080">例如：KillTimer(1); </p>
<p style="COLOR: #000080">当要使用回调函数时，</p>
<p style="COLOR: #000080">此方法首先写一个如下格式的回调函数</p>
<p style="COLOR: #000080">void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);<br>然后再用SetTimer(1,100,TimerProc)函数来建一个定时器，第三个参数就是回调函数地址。</p>
<p style="COLOR: #000080">或许你会问，如果我要加入两个或者两个以上的 timer怎么办？ </p>
<p style="COLOR: #000080">继续用SetTimer函数吧，上次的timer的ID是1，这次可以是2，3，4。。。。 </p>
<p style="COLOR: #000080">SetTimer(2,1000,NULL); </p>
<p style="COLOR: #000080">SetTimer(3,500,NULL); </p>
<p style="COLOR: #000080">嗯，WINDOWS会协调他们的。当然onTimer函数体也要发生变化，要在函数体内添加每一个timer的处理代码： </p>
<p style="COLOR: #000080">onTimer(nIDEvent) </p>
<p style="COLOR: #000080">{ </p>
<p style="COLOR: #000080">switch(nIDEvent) </p>
<p style="COLOR: #000080">{ </p>
<p style="COLOR: #000080">case 1:........; </p>
<p style="COLOR: #000080">break; </p>
<p style="COLOR: #000080">case 2:.......; </p>
<p style="COLOR: #000080">break; </p>
<p style="COLOR: #000080">case 3:......; </p>
<p style="COLOR: #000080">break; </p>
<p style="COLOR: #000080">} </p>
<p style="COLOR: #000080">}</p>
<img src ="http://www.cppblog.com/aurain/aggbug/43589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-03-03 10:49 <a href="http://www.cppblog.com/aurain/archive/2008/03/03/43589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆和栈的联系和区别</title><link>http://www.cppblog.com/aurain/archive/2008/02/22/43094.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Fri, 22 Feb 2008 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/02/22/43094.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/43094.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/02/22/43094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/43094.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/43094.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red">联系：</span>都是用来处理变量的内存分配的。</p>
<p><span style="COLOR: red">区别：</span>主要的区别由以下几点：</p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 1</font>、管理方式不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 2</font>、空间大小不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 3</font>、能否产生碎片不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 4</font>、生长方向不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 5</font>、分配方式不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; 6</font>、分配效率不同；</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>管理方式：对于栈来讲，是由编译器自动管理，无需我们手工控制；对于堆来说，释放工作由程序员控制，容易产生<font size=+0>memory leak</font>。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>空间大小：一般来讲在<font size=+0>32</font>位系统下，堆内存可以达到<font size=+0>4G</font>的空间，从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲，一般都是有一定的空间大小的，例如，在<font size=+0>VC6</font>下面，默认的栈空间大小是<font size=+0>1M</font>（好像是，记不清楚了）。当然，我们可以修改：<font size=+0>&nbsp;&nbsp;&nbsp; </font></font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>打开工程，依次操作菜单如下：<font size=+0>Project-&gt;Setting-&gt;Link</font>，在<font size=+0>Category </font>中选中<font size=+0>Output</font>，然后在<font size=+0>Reserve</font>中设定堆栈的最大值和<font size=+0>commit</font>。</font></p>
<p><font color=#000000>注意：<font size=+0>reserve</font>最小值为<font size=+0>4Byte</font>；<font size=+0>commit</font>是保留在虚拟内存的页文件里面，它设置的较大会使栈开辟较大的值，可能增加内存的开销和启动时间。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>碎片问题：对于堆来讲，频繁的<font size=+0>new/delete</font>势必会造成内存空间的不连续，从而造成大量的碎片，使程序效率降低。对于栈来讲，则不会存在这个问题，因为栈是先进后出的队列，他们是如此的一一对应，以至于永远都不可能有一个内存块从栈中间弹出，在他弹出之前，在他上面的后进的栈内容已经被弹出，详细的可以参考数据结构，这里我们就不再一一讨论了。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>生长方向：对于堆来讲，生长方向是向上的，也就是向着内存地址增加的方向；对于栈来讲，它的生长方向是向下的，是向着内存地址减小的方向增长。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>分配方式：堆都是动态分配的，没有静态分配的堆。栈有<font size=+0>2</font>种分配方式：静态分配和动态分配。静态分配是编译器完成的，比如局部变量的分配。动态分配由<font size=+0>alloca</font>函数进行分配，但是栈的动态分配和堆是不同的，他的动态分配是由编译器进行释放，无需我们手工实现。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>分配效率：栈是机器系统提供的数据结构，计算机会在底层对栈提供支持：分配专门的寄存器存放栈的地址，压栈出栈都有专门的指令执行，这就决定了栈的效率比较高。堆则是<font size=+0>C/C++</font>函数库提供的，它的机制是很复杂的，例如为了分配一块内存，库函数会按照一定的算法（具体的算法可以参考数据结构<font size=+0>/</font>操作系统）在堆内存中搜索可用的足够大小的空间，如果没有足够大小的空间（可能是由于内存碎片太多），就有可能调用系统功能去增加程序数据段的内存空间，这样就有机会分到足够大小的内存，然后进行返回。显然，堆的效率比栈要低得多。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>从这里我们可以看到，堆和栈相比，由于大量<font size=+0>new/delete</font>的使用，容易造成大量的内存碎片；由于没有专门的系统支持，效率很低；由于可能引发用户态和核心态的切换，内存的申请，代价变得更加昂贵。所以栈在程序中是应用最广泛的，就算是函数的调用也利用栈去完成，函数调用过程中的参数，返回地址，<font size=+0>EBP</font>和局部变量都采用栈的方式存放。所以，我们推荐大家尽量用栈，而不是用堆。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>虽然栈有如此众多的好处，但是由于和堆相比不是那么灵活，有时候分配大量的内存空间，还是用堆好一些。</font></p>
<p><font color=#000000><font size=+0>&nbsp;&nbsp;&nbsp; </font>无论是堆还是栈，都要防止越界现象的发生（除非你是故意使其越界），因为越界的结果要么是程序崩溃，要么是摧毁程序的堆、栈结构，产生以想不到的结果<font size=+0>,</font>就算是在你的程序运行过程中，没有发生上面的问题，你还是要小心，说不定什么时候就崩掉，那时候<font size=+0>debug</font>可是相当困难：）<br></font><font color=#000000>&nbsp;&nbsp;&nbsp;&nbsp; 对了，还有一件事，如果有人把堆栈合起来说，那它的意思是栈，可不是堆，呵呵，清楚了</font></p>
<img src ="http://www.cppblog.com/aurain/aggbug/43094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-02-22 18:04 <a href="http://www.cppblog.com/aurain/archive/2008/02/22/43094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针和引用的联系与区别</title><link>http://www.cppblog.com/aurain/archive/2008/02/22/43093.html</link><dc:creator>水</dc:creator><author>水</author><pubDate>Fri, 22 Feb 2008 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/aurain/archive/2008/02/22/43093.html</guid><wfw:comment>http://www.cppblog.com/aurain/comments/43093.html</wfw:comment><comments>http://www.cppblog.com/aurain/archive/2008/02/22/43093.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/aurain/comments/commentRss/43093.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aurain/services/trackbacks/43093.html</trackback:ping><description><![CDATA[<p>★ 相同点：<br>1. 都是地址的概念；<br>指针指向一块内存，它的内容是所指内存的地址；引用是某块内存的别名。<br><br>★ 区别：<br>1. 指针是一个实体，而引用仅是个别名；<br>2. 引用使用时无需解引用(*)，指针需要解引用；<br>3. 引用只能在定义时被初始化一次，之后不可变；指针可变；<br>4. 引用没有 const，指针有 const；<br>5. 引用不能为空，指针可以为空；<br>6. &#8220;sizeof 引用&#8221;得到的是所指向的变量(对象)的大小，而&#8220;sizeof 指针&#8221;得到的是指针本身(所指向的变量或对象的地址)的大小；<br>7. 指针和引用的自增(++)运算意义不一样；<br>8.从内存分配上看：程序为指针变量分配内存区域，而引用不需要分配内存区域。<br></p>
<img src ="http://www.cppblog.com/aurain/aggbug/43093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aurain/" target="_blank">水</a> 2008-02-22 18:00 <a href="http://www.cppblog.com/aurain/archive/2008/02/22/43093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>