﻿<?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++博客-yeqing-文章分类-c++</title><link>http://www.cppblog.com/yeqing/category/2365.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:40:17 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:40:17 GMT</pubDate><ttl>60</ttl><item><title>MOTO的面试题～先贴出来，以后再慢慢解答吧</title><link>http://www.cppblog.com/yeqing/articles/13906.html</link><dc:creator>夜沁</dc:creator><author>夜沁</author><pubDate>Fri, 20 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/yeqing/articles/13906.html</guid><wfw:comment>http://www.cppblog.com/yeqing/comments/13906.html</wfw:comment><comments>http://www.cppblog.com/yeqing/articles/13906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yeqing/comments/commentRss/13906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yeqing/services/trackbacks/13906.html</trackback:ping><description><![CDATA[
		<font color="#808080" size="2">1、智能指针，com实现的原理， <br />2、printf（）可变参数如何实现 <br />3、标准模板库vector追加数据如何实现。是底层如何实现，不能用现有的东东。 <br />4、还有，java的垃圾收集机制如何实现为什么？如果是你自己实现垃圾收集机制，如何实 <br />现？ 用什么数据结构。 <br />5、二叉排序树和哈希表那个查找效率高，实用于pda 。 <br />6、.net的底层实现机制。 <br />7、进程间通信如何实现。 <br />8、还有迭代问题，什么问题用迭代，迭代在操作系统中如何实现的 。 <br />9、如何交换两个变量，不能用中间变量。 <br />10、c与c++static函数的区别？？？ <br />11、const 函数的作用，如何实现钩子函数。 <br />12、两层容错技术怎么实现？ <br />13、写出函数指针，函数返回指针，const指针，指向const的指针，指向const的const指针. <br />14、函数调用如何实现，注意什么问题。 <br />15、指针和引用的差别， <br />16、拷贝构造函数如何实现，什么情况下会用到。<br /></font>
<img src ="http://www.cppblog.com/yeqing/aggbug/13906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yeqing/" target="_blank">夜沁</a> 2006-10-20 16:27 <a href="http://www.cppblog.com/yeqing/articles/13906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用不同的方法读取和写入二进制文件</title><link>http://www.cppblog.com/yeqing/articles/13904.html</link><dc:creator>夜沁</dc:creator><author>夜沁</author><pubDate>Fri, 20 Oct 2006 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/yeqing/articles/13904.html</guid><wfw:comment>http://www.cppblog.com/yeqing/comments/13904.html</wfw:comment><comments>http://www.cppblog.com/yeqing/articles/13904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yeqing/comments/commentRss/13904.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yeqing/services/trackbacks/13904.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#808080" size="2">第一：读取为unsigned char*的数组然后写入文件</font>
		</p>
		<p>
				<font color="#808080" size="2">#include &lt;cstdlib&gt;<br />#include &lt;iostream&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;fstream&gt;   <br />#include &lt;sys/types.h&gt;<br />#include &lt;sys/stat.h&gt;<br />#include &lt;unistd.h&gt;</font>
		</p>
		<p>
				<font color="#808080" size="2">using namespace std;</font>
		</p>
		<p>
				<font color="#808080" size="2">int main(int argc, char *argv[])<br />{<br />    if(argc&lt;3)<br />    {<br />        cout&lt;&lt;"参数错误"&lt;&lt;endl;<br />        cout&lt;&lt;"&lt;CMD&gt; &lt;FileNameSrc&gt; &lt;FileNameDis&gt;"&lt;&lt;endl;<br />        exit(-1);<br />    } <br />    <br />  int nFileSize=0;<br />//读出二进制文件的大小nFileSize <br />  struct stat fFileMesg;<br />  stat(argv[1],&amp;fFileMesg);<br />  cout&lt;&lt;fFileMesg.st_size&lt;&lt;endl;<br />  nFileSize=fFileMesg.st_size;<br /> <br />//用二进制格式打开读写文件 <br />  ofstream ifs(argv[2],ios::binary);<br />  ifstream ofs(argv[1],ios::binary);</font>
		</p>
		<p>
				<font color="#808080" size="2">   if(!ifs)<br />    {<br />       cout&lt;&lt;"打开读取文件["&lt;&lt;argv[1]&lt;&lt;"]失败"&lt;&lt;endl;<br />       system("PAUSE");<br />       return -1; <br />     }</font>
		</p>
		<p>
				<font color="#808080" size="2">  if(!ofs)<br />    {<br />       cout&lt;&lt;"打开写入文件["&lt;&lt;argv[2]&lt;&lt;"]失败"&lt;&lt;endl;<br />       system("PAUSE");<br />       return -1; <br />    }</font>
		</p>
		<p>
				<font color="#808080" size="2">//动态申请缓冲区，缓冲区大小为文件大小<br />    unsigned char *NewBuffer=new unsigned char[nFileSize];<br />//把二进制文件流读写到缓冲区中<br />    ofs.read((char *)NewBuffer, sizeof(char)*nFileSize);<br />//把缓冲区写入到文件中<br />    ifs.write((char *)NewBuffer, sizeof(char)*nFileSize);</font>
		</p>
		<p>
				<font color="#808080" size="2">    system("PAUSE");<br />//释放缓冲区和关闭文件流<br />    ifs.close();<br />    ofs.close();<br />    delete NewBuffer;<br />    return EXIT_SUCCESS;<br />}</font>
		</p>
		<p>
				<br />
				<font color="#808080" size="2">第二：使用强制转换指针四个直接读取</font>
		</p>
		<p>
				<font color="#808080" size="2">#include &lt;cstdlib&gt;<br />#include &lt;iostream&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;fstream&gt;   <br />#include &lt;sys/types.h&gt;<br />#include &lt;sys/stat.h&gt;<br />#include &lt;unistd.h&gt;</font>
		</p>
		<p>
				<font color="#808080" size="2">using namespace std;</font>
		</p>
		<p>
				<font color="#808080" size="2">int main(int argc, char *argv[])<br />{<br />    if(argc&lt;3)<br />    {<br />        cout&lt;&lt;"参数错误"&lt;&lt;endl;<br />        cout&lt;&lt;"&lt;CMD&gt; &lt;FileNameSrc&gt; &lt;FileNameDis&gt;"&lt;&lt;endl;<br />        exit(-1);<br />    } <br />    <br /> int nFileSize=0;<br />//读出二进制文件的大小nFileSize <br /> struct stat fFileMesg;<br /> stat(argv[1],&amp;fFileMesg);<br /> cout&lt;&lt;fFileMesg.st_size&lt;&lt;endl;<br /> nFileSize=fFileMesg.st_size;<br /> <br />//用二进制格式打开读写文件 <br /> ofstream ifs(argv[2],ios::binary);<br /> ifstream ofs(argv[1],ios::binary);</font>
		</p>
		<p>
				<font color="#808080" size="2">  if(!ifs)<br />    {<br />     cout&lt;&lt;"打开读取文件["&lt;&lt;argv[1]&lt;&lt;"]失败"&lt;&lt;endl;<br />     system("PAUSE");<br />     return -1; <br />     }</font>
		</p>
		<p>
				<font color="#808080" size="2"> if(!ofs)<br />    {<br />     cout&lt;&lt;"打开写入文件["&lt;&lt;argv[2]&lt;&lt;"]失败"&lt;&lt;endl;<br />     system("PAUSE");<br />     return -1; <br />     }</font>
		</p>
		<p>
				<font color="#808080" size="2">//使用int型强制转换四个字节四个字节读取 <br /> int nTmp=5;<br /> int nCount=0;<br /> while(!ofs.eof())<br /> {<br />  ofs.read((char*)(&amp;nTmp), sizeof(nTmp)); <br />//gcount()函数可以返回read读取的直接数<br />  nCount+=ofs.gcount();<br />  ifs.write((char*)(&amp;nTmp), sizeof(nTmp));<br /> }<br />//关闭文件流<br />  ifs.close();<br />  ofs.close();<br />  system("PAUSE");<br />  return EXIT_SUCCESS;<br />}<br /></font>
		</p>
<img src ="http://www.cppblog.com/yeqing/aggbug/13904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yeqing/" target="_blank">夜沁</a> 2006-10-20 16:16 <a href="http://www.cppblog.com/yeqing/articles/13904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++书的诱惑</title><link>http://www.cppblog.com/yeqing/articles/12797.html</link><dc:creator>夜沁</dc:creator><author>夜沁</author><pubDate>Thu, 21 Sep 2006 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/yeqing/articles/12797.html</guid><wfw:comment>http://www.cppblog.com/yeqing/comments/12797.html</wfw:comment><comments>http://www.cppblog.com/yeqing/articles/12797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yeqing/comments/commentRss/12797.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yeqing/services/trackbacks/12797.html</trackback:ping><description><![CDATA[
		<font color="#808080" size="2">《C++程序设计语言》:如果你只买一本C++书，这本就是你的选择，作者Bjarne就是让你做出这样选择的全部理由，没有人能比他更了解什么样才是真正的使用C++编程了，有人说到这本书语言晦涩，或者对与初学者此书不适合，对此评论我颇不以为然，我看的是中文版，起码在我看来语言描叙非常到位，我喜欢这样的技术描叙风格。全书的核心就是告诉你如何去用正确的观念编写正确的C++的代码。强烈推荐。</font>
		<p>
				<font color="#808080" size="2">　　《C++语言设计与演化》:这本书也是我同时拥有中英两版的两本书之一(另外一本是《设计模式》)。如果在得到上面的那本书之后你需要第二本，那么在我看来这就是你的选择，作者同样是Bjarne，他将在这本书中告诉你C++的起源与发展，语言原则与本质，各种特性加入的理由和考量，以及几乎一切关于C++有趣的故事。我阅读过中英两版，都是强烈推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++标准程序库》:在AMAZON上面关于C++书籍评论最为火暴的一本。全书对于标准程序库的介绍可谓深入浅出，而且全书都是从实际运用出发，书中例子简单却非常说明问题，加上一些</font>
				<a class="bluekey" href="http://www.yesky.com/key/4929/174929.html" target="_blank">
						<font color="#808080" size="2">图表</font>
				</a>
				<font color="#808080" size="2">的陈列，使其概念十分清晰，而且从手册和学习两方面看都有其存在价值。强烈推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《EFFECTIVE C++ 中文版》:无须多说，在任何C++书籍推荐目录中都可以找到这本书的身影，盛名之下必无虚士。主要强调的是运用C++的各种特性的时候所必须注意的地方，以及一些比较通用的设计手段。其短小精悍的语言自然非常适合快节奏的现代风格，个人就十分喜欢Meyer的写作方式。强烈推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《MORE EFFECTIVE C++ 中文版》:做为上本书的姐妹篇，一样的写作风格，一样的写作目的。只是个人认为和其</font>
				<a class="bluekey" href="http://www.yesky.com/key/3543/198543.html" target="_blank">
						<font color="#808080" size="2">姐姐</font>
				</a>
				<font color="#808080" size="2">相比，存在差距，主要是信息量没有《EFFECTIVE C++ 中文版》那么大，主要说到了一些C++的设计惯用手法。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++ PRIMER 中文版》:同样是出自大师之手，作者LIPPMAN，作为早期C++编译器的实现者之一，对与C++的了解以及该如何论序都有自己的独到见解。做为C++的百科全书和《C++程序设计语言》有着一样的地位。但是前者更强调的是C++的语法和其语义，而后者则是以如何用C++进行合理设计做为描叙的中心。全书构思十分巧妙，书的一开始就直接进入C++的主题，前面五章都用类设计一个数据结构，让读者完全明白了各种用户定义类型所代表的抽象能力，然后直接进入第六章标准库中的容器类，这样的设计让读者十分清楚的建立容器和类这两个C++中十分重要的概念。这样的设计针对有一定基础的C++读者来说可以说是非常有效果的。但是对于初学者来说，这确实不是一本合适的书籍，因为一上来太多的名词会把刚刚接触C++的人吓着的。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++沉思录》:非常有特点的一本书，全书假设读者已经通晓C++语言，重点告诉读者C++的概念以及一些C++的设计手段，比如用C++到底为什么会比C或者其他过程语言更好?(书中给出的答案是，因为只有对象才有能力保持一定的状态，而算法没有这样的能力)，如何进行抽象数据类型的程序设计，如何理解多态，如何通过代理隐藏继承，如何进行引用技数，为了效率如何进行缓时拷贝，以及模板技术是如何发展演进最后构成成STL库的。阅读感觉和《C++程序设计语言》一样，思想性非常强，读这样的书很累，脑子必须一直思考问题，思考作者里面提出的问题和他提出的解决方式。这本书最大的特点是非常直接的把C++语言的核心暴露出来-----三种抽象模型和极其语言设施本身对这三种抽象模型的支持。而《C++沉思录》给我的更深层思考是什么才是运用C++最合理的方式。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++ STL中文版》:很朴实，不花俏，但是价值很高。个人认为其主要价值体现在以下几个方面:1，对于STL的实现关键iterator一般都使用了两种方式描叙，一种比较老式的函数方法，一种是新的?traits技巧，这样读者可以非常清楚的知道技术的演进。2，提供了一个STL LITE版本，阅读这样的代码对自己的提高非常大。3，书中提供的测试模块对于读者来说也是非常有的一章，对于想扩展STL的，可以按照上面提供的方法测试自己的STL组件。缺点:装订比较粗糙，与大师之作的地位不相称。推荐</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++ PRIMER PLUS 中文版》:一本思想性不是很强，技巧性不是很强的书，但是对于初学者来说非常合适的书。其中许多论序方式都和具体化，总体来说，这本书是我看过的C++书籍里面最合适初学者的。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《深度探索C++对象模型》:这也是一本比较特别的书，告诉你编译器是如何安排处理对象的内存空间的，以及一些OO特性是如何实现的。不认为这是一本C++必须读物，算是课后读物应该比较合适吧，因为有时间了解C++的OO实现还不如花点时间搞清楚OO理论的本质概念:type theory。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++设计新思维——泛型编程与设计模式之应用》:可谓C++中的奇书。这样的一本书，很难让人做出正确的评价与推荐指数(尤其是以我这个实用和人生本就应该享乐为人生观的人来说~:)，因为全书所代表的思想前卫到了有点不切实际的地步，模式+泛型—多么高雅的组合。我个人的观点是，只有一部分人需要阅读此书，他们就是所谓的real c++ fans，暂且不提C++本身是否遇到了困难，就其书中所代表的设计思想，对于C++没有一点感情的程序员(感情就是以爱好为基础，而不是以攒钱为前提)，我想对于这样的设计技术总会有晕的感觉，而一般程序员多半都不会喜欢这样的感觉~:)。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《对象揭秘:Java、Eiffel和C++》:从书名就可以看出这本书不仅仅和C++有关系。可以说全书就是对C++的一次批判吧(书也起源与作者的一篇批判C++的文章)。有时候听听另外一种声音对自己保持清醒的头脑是非常有帮助的，对待一个人，对待一本书以及对待一门程序设计语言都是如此。这本书好象不是很火，大概跟其宣传不是很到位，或者同能同时了解这三门语言并比较关心这些语言深层次的优略的读者比较少有关系吧，在我看来这本书包含了许多对象与类型方面的理论，最为出彩的就是作者抓住Bjarne的“在C++中一个类就是一个类型”这样的“错误”言论狠批的论证过程。看这本书另外一个好处是能教会大家该如何去合理的辩驳自己的对手~:)。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《大规模C++程序设计》:书在手上很久了，可一直没有仔细看，这也是评论之前必须说明的。总体看来书中涉及的很多东西都鲜见于其他读本。不管AMAZON上的评论是否是这本书比较过时，起码它介绍的许多对与我来说都是我所不知道不了解的，别人说过时是他的事情。而我，还是推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《STL和泛型编程》:难得的一本关于泛型编程的理念书籍，同样也是作为手册和学习两用，但是其手册不是使用手册，而是概念手册，对于设计自己的STL组件，这本书有非常好的帮助，虽然网上有篇STL的文档，其中的70%内容和这本书雷同，但此书仍不失可读性。推荐。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《C++编程思想 第二版》:非常一般的书，是的这就是我对这本很多人奉为名著的评论，至于为什么是这样的评论，或者你不相信我说的是客观话，在你买了之后看完就知道了。一般。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《Essential C++中文版》:总感觉这本书定位不是很清楚，因为对于初学者来说其开始就涉及了太多的名词，初学者看这本书，几乎就不要指望能很好的入门。而对于进阶者来说，其内容并无新意，对于C++高手来说，这样的小读本，根本就没有阅读的必要，也许是LIPPMAN+JJHOU的盛名吧，但我觉得这次算是有虚士了~:)。一般。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《STL源码剖析》:侯SIR的大陆两本著作之一，但在我心中其质量好象并不如很多人说的那样好，就同类作品《C++ STL中文版》相比较内容略现单薄，并且三章之后很多东西都给人以堆砌的感觉，而且大部分精彩的材料都出自《STL和泛型编程》一书，给人感觉书中侯SIR自己的东西并不多，但第二章对于</font>
				<a class="bluekey" href="http://www.yesky.com/key/2241/202241.html" target="_blank">
						<font color="#808080" size="2">内存管理</font>
				</a>
				<font color="#808080" size="2">有很好的论叙表现，并且装订精良，尤其是那些图更是侯SIR的拿手好戏，但总体感觉有点华而不实。一般。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　后面列出两本不推荐的，具体原因也就不再分析。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《高质量程序设计指南--C++/C语言》，《C++编码规范》</font>
		</p>
		<p>
				<font color="#808080" size="2">　　另外两本常见的C++书籍:</font>
		</p>
		<p>
				<font color="#808080" size="2">　　《Exceptional C++中文版》，《More Exceptional C++中文版》我本人并没有阅读过，但其名声不小，而且加之曾经给此书作者Herb Sutter通邮件的经历，那种考虑到时差都不到24个小时的回信率以及在信中耐心的对技术讲解的态度，同样向大家推荐这两本书，因为在我看来Herb Sutter能力无须考虑加上这样待人的态度，其作品理所值得大家阅读。</font>
		</p>
		<p>
				<font color="#808080" size="2">　　是的，上面就是我大半年来看过的C++的书籍，肯定不少人要嘲笑我的个书呆子了~:)，其实我确实就是一个书呆子，至于是否需要看这么多书，我个人意见是不需要，不然我还给出推荐等级干什么?选择自己需要的就是最好。引用曾经有人说到的---评书其实就是个“如人饮水，冷暖自知”的事情。真正的书评在哪里?各自的心里。</font>
		</p>
<img src ="http://www.cppblog.com/yeqing/aggbug/12797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yeqing/" target="_blank">夜沁</a> 2006-09-21 16:08 <a href="http://www.cppblog.com/yeqing/articles/12797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>检查文件是否存在的代码</title><link>http://www.cppblog.com/yeqing/articles/12794.html</link><dc:creator>夜沁</dc:creator><author>夜沁</author><pubDate>Thu, 21 Sep 2006 06:59:00 GMT</pubDate><guid>http://www.cppblog.com/yeqing/articles/12794.html</guid><wfw:comment>http://www.cppblog.com/yeqing/comments/12794.html</wfw:comment><comments>http://www.cppblog.com/yeqing/articles/12794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yeqing/comments/commentRss/12794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yeqing/services/trackbacks/12794.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#808080" size="2">#include &lt;sys/types.h&gt;<br />#include &lt;sys/stat.h&gt;<br />#include &lt;unistd.h&gt;<br />#include &lt;errno.h&gt;<br />extern int errno;<br />int CheckFileExit(const char *szFileName)<br />{<br />  struct stat st; <br />   if(lstat(szFileName,&amp;st)!= -1)<br />   {<br />      return 0;<br />   }<br />   else if(errno==ENOENT)<br />   {<br />      return -1;<br />   }<br /> return -2;<br />}</font>
		</p>
		<p>
				<font color="#808080" size="2">int main( int argc, char* argv[] )<br />{<br />    char pReturnUrl[100]={0};<br />    int nResault=0;<br /> <br />    if(argc!=2)<br />    {<br />        printf("缺少文件名\n");<br />        return -1;<br />    }<br />    nResault=CheckFileExit(argv[1]);<br />    printf("访问文件名为：%s\n",argv[1]);<br />    printf("访问结果为:%d\n",nResault);<br />    return 0;<br />}</font>
		</p>
<img src ="http://www.cppblog.com/yeqing/aggbug/12794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yeqing/" target="_blank">夜沁</a> 2006-09-21 14:59 <a href="http://www.cppblog.com/yeqing/articles/12794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结构体对齐的具体含义(#pragma pack)</title><link>http://www.cppblog.com/yeqing/articles/11052.html</link><dc:creator>夜沁</dc:creator><author>夜沁</author><pubDate>Wed, 09 Aug 2006 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/yeqing/articles/11052.html</guid><wfw:comment>http://www.cppblog.com/yeqing/comments/11052.html</wfw:comment><comments>http://www.cppblog.com/yeqing/articles/11052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yeqing/comments/commentRss/11052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yeqing/services/trackbacks/11052.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#808080" size="2">#pragma pack(4)<br />class TestB<br />{<br />public:<br />　　int aa;<br />　　char a;<br />　　short b;<br />　　char c;<br />};<br />int nSize = sizeof(TestB);<br />这里nSize结果为12，在预料之中。</font>
		</p>
		<p>
				<font color="#808080" size="2">现在去掉第一个成员变量为如下代码：<br />#pragma pack(4)<br />class TestC<br />{<br />public:<br />　　char a;<br />　　short b;<br />　　char c;<br />};<br />int nSize = sizeof(TestC);<br />按照正常的填充方式nSize的结果应该是8，为什么结果显示nSize为6呢？</font>
		</p>
		<p>
				<font color="#808080" size="2">事实上，很多人对#pragma pack的理解是错误的。<br />#pragma pack规定的对齐长度，实际使用的规则是：<br />结构，联合，或者类的数据成员，第一个放在偏移为0的地方，以后每个数据成员的对齐，按照#pragma pack指定的数值和这个数据成员自身长度中，比较小的那个进行。<br />也就是说，当#pragma pack的值等于或超过所有数据成员长度的时候，这个值的大小将不产生任何效果。<br />而结构整体的对齐，则按照结构体中最大的数据成员 和 #pragma pack指定值 之间，较小的那个进行。</font>
		</p>
		<p>
				<font color="#808080" size="2">具体解释<br />#pragma pack(4)<br />　　class TestB<br />　　{<br />　　public:<br />　　　　int aa; //第一个成员，放在[0,3]偏移的位置，<br />　　　　char a; //第二个成员，自身长为1，#pragma pack(4),取小值，也就是1，所以这个成员按一字节对齐，放在偏移[4]的位置。<br />　　　　short b; //第三个成员，自身长2，#pragma pack(4)，取2，按2字节对齐，所以放在偏移[6,7]的位置。<br />　　　　char c; //第四个，自身长为1，放在[8]的位置。<br />　　};<br />这个类实际占据的内存空间是9字节<br />类之间的对齐，是按照类内部最大的成员的长度，和#pragma pack规定的值之中较小的一个对齐的。<br />所以这个例子中，类之间对齐的长度是min(sizeof(int),4)，也就是4。<br />9按照4字节圆整的结果是12，所以sizeof(TestB)是12。</font>
		</p>
		<p>
				<br />
				<font color="#808080" size="2">如果<br />#pragma pack(2)<br />class TestB<br />　　{<br />　　public:<br />　　　　int aa; //第一个成员，放在[0,3]偏移的位置，<br />　　　　char a; //第二个成员，自身长为1，#pragma pack(4),取小值，也就是1，所以这个成员按一字节对齐，放在偏移[4]的位置。<br />　　　　short b; //第三个成员，自身长2，#pragma pack(4)，取2，按2字节对齐，所以放在偏移[6,7]的位置。<br />　　　　char c; //第四个，自身长为1，放在[8]的位置。<br />　　};<br />//可以看出，上面的位置完全没有变化，只是类之间改为按2字节对齐，9按2圆整的结果是10。<br />//所以 sizeof(TestB)是10。</font>
		</p>
		<p>
				<font color="#808080" size="2">最后看原贴：<br />现在去掉第一个成员变量为如下代码：<br />　　#pragma pack(4)<br />　　class TestC<br />　　{<br />　　public:<br />　　　　char a;//第一个成员，放在[0]偏移的位置，<br />　　　　short b;//第二个成员，自身长2，#pragma pack(4)，取2，按2字节对齐，所以放在偏移[2,3]的位置。<br />　　　　char c;//第三个，自身长为1，放在[4]的位置。<br />　　};<br />//整个类的大小是5字节，按照min(sizeof(short),4)字节对齐，也就是2字节对齐，结果是6<br />//所以sizeof(TestC)是6。</font>
		</p>
<img src ="http://www.cppblog.com/yeqing/aggbug/11052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yeqing/" target="_blank">夜沁</a> 2006-08-09 17:24 <a href="http://www.cppblog.com/yeqing/articles/11052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>