﻿<?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++博客-micromichael</title><link>http://www.cppblog.com/micromichael/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 22:48:42 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 22:48:42 GMT</pubDate><ttl>60</ttl><item><title>堆和栈的区别（转过无数次的文章）</title><link>http://www.cppblog.com/micromichael/archive/2010/04/10/112170.html</link><dc:creator>micromichael</dc:creator><author>micromichael</author><pubDate>Sat, 10 Apr 2010 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/micromichael/archive/2010/04/10/112170.html</guid><wfw:comment>http://www.cppblog.com/micromichael/comments/112170.html</wfw:comment><comments>http://www.cppblog.com/micromichael/archive/2010/04/10/112170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/micromichael/comments/commentRss/112170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/micromichael/services/trackbacks/112170.html</trackback:ping><description><![CDATA[<p>一、预备知识—程序的内存分配&nbsp; <br>&nbsp; 一个由C/C++编译的程序占用的内存分为以下几个部分&nbsp; <br>&nbsp; 1、栈区（stack）—&nbsp;&nbsp; 由编译器自动分配释放&nbsp;&nbsp; ，存放函数的参数值，局部变量的值等。其&nbsp; <br>&nbsp; 操作方式类似于数据结构中的栈。&nbsp; <br>&nbsp; 2、堆区（heap）&nbsp;&nbsp; —&nbsp;&nbsp; 一般由程序员分配释放，&nbsp;&nbsp; 若程序员不释放，程序结束时可能由OS回&nbsp; <br>&nbsp; 收&nbsp;&nbsp; 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。&nbsp; <br>&nbsp; 3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的&nbsp; <br>&nbsp; 全局变量和静态变量在一块区域，&nbsp;&nbsp; 未初始化的全局变量和未初始化的静态变量在相邻的另&nbsp; <br>&nbsp; 一块区域。&nbsp;&nbsp; -&nbsp;&nbsp; 程序结束后由系统释放。&nbsp; <br>&nbsp; 4、文字常量区&nbsp;&nbsp; —常量字符串就是放在这里的。&nbsp;&nbsp; 程序结束后由系统释放&nbsp; <br>&nbsp; 5、程序代码区—存放函数体的二进制代码。&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 二、例子程序&nbsp;&nbsp;&nbsp; <br>&nbsp; 这是一个前辈写的，非常详细&nbsp;&nbsp;&nbsp; <br>&nbsp; //main.cpp&nbsp;&nbsp;&nbsp; <br>&nbsp; int&nbsp;&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; 全局初始化区&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; *p1;&nbsp;&nbsp; 全局未初始化区&nbsp;&nbsp;&nbsp; <br>&nbsp; main()&nbsp;&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp; int&nbsp;&nbsp; b;&nbsp;&nbsp; 栈&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; s[]&nbsp;&nbsp; =&nbsp;&nbsp; "abc";&nbsp;&nbsp; 栈&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; *p2;&nbsp;&nbsp; 栈&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; *p3&nbsp;&nbsp; =&nbsp;&nbsp; "123456";&nbsp;&nbsp; 123456\0在常量区，p3在栈上。&nbsp;&nbsp;&nbsp; <br>&nbsp; static&nbsp;&nbsp; int&nbsp;&nbsp; c&nbsp;&nbsp; =0；&nbsp;&nbsp; 全局（静态）初始化区&nbsp;&nbsp;&nbsp; <br>&nbsp; p1&nbsp;&nbsp; =&nbsp;&nbsp; (char&nbsp;&nbsp; *)malloc(10);&nbsp;&nbsp;&nbsp; <br>&nbsp; p2&nbsp;&nbsp; =&nbsp;&nbsp; (char&nbsp;&nbsp; *)malloc(20);&nbsp;&nbsp;&nbsp; <br>&nbsp; 分配得来得10和20字节的区域就在堆区。&nbsp;&nbsp;&nbsp; <br>&nbsp; strcpy(p1,&nbsp;&nbsp; "123456");&nbsp;&nbsp; 123456\0放在常量区，编译器可能会将它与p3所指向的"123456"&nbsp; <br>&nbsp; 优化成一个地方。&nbsp;&nbsp;&nbsp; <br>&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 二、堆和栈的理论知识&nbsp;&nbsp;&nbsp; <br>&nbsp; 2.1申请方式&nbsp;&nbsp;&nbsp; <br>&nbsp; stack:&nbsp;&nbsp;&nbsp; <br>&nbsp; 由系统自动分配。&nbsp;&nbsp; 例如，声明在函数中一个局部变量&nbsp;&nbsp; int&nbsp;&nbsp; b;&nbsp;&nbsp; 系统自动在栈中为b开辟空&nbsp; <br>&nbsp; 间&nbsp;&nbsp;&nbsp; <br>&nbsp; heap:&nbsp;&nbsp;&nbsp; <br>&nbsp; 需要程序员自己申请，并指明大小，在c中malloc函数&nbsp;&nbsp;&nbsp; <br>&nbsp; 如p1&nbsp;&nbsp; =&nbsp;&nbsp; (char&nbsp;&nbsp; *)malloc(10);&nbsp;&nbsp;&nbsp; <br>&nbsp; 在C++中用new运算符&nbsp;&nbsp;&nbsp; <br>&nbsp; 如p2&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; char[10];&nbsp;&nbsp;&nbsp; <br>&nbsp; 但是注意p1、p2本身是在栈中的。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.2&nbsp;&nbsp;&nbsp; <br>&nbsp; 申请后系统的响应&nbsp;&nbsp;&nbsp; <br>&nbsp; 栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢&nbsp; <br>&nbsp; 出。&nbsp;&nbsp;&nbsp; <br>&nbsp; 堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，&nbsp; <br>&nbsp; 会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表&nbsp; <br>&nbsp; 中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的&nbsp; <br>&nbsp; 首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。&nbsp; <br>&nbsp; 另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部&nbsp; <br>&nbsp; 分重新放入空闲链表中。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.3申请大小的限制&nbsp;&nbsp;&nbsp; <br>&nbsp; 栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意&nbsp; <br>&nbsp; 思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M（也有&nbsp; <br>&nbsp; 的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将&nbsp; <br>&nbsp; 提示overflow。因此，能从栈获得的空间较小。&nbsp;&nbsp;&nbsp; <br>&nbsp; 堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储&nbsp; <br>&nbsp; 的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小&nbsp; <br>&nbsp; 受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.4申请效率的比较：&nbsp;&nbsp;&nbsp; <br>&nbsp; 栈由系统自动分配，速度较快。但程序员是无法控制的。&nbsp;&nbsp;&nbsp; <br>&nbsp; 堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.&nbsp;&nbsp;&nbsp; <br>&nbsp; 另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是&nbsp; <br>&nbsp; 直接在进程的地址空间中保留一块内存，虽然用起来最不方便。但是速度快，也最灵活。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.5堆和栈中的存储内容&nbsp;&nbsp;&nbsp; <br>&nbsp; 栈：&nbsp;&nbsp; 在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可&nbsp; <br>&nbsp; 执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈&nbsp; <br>&nbsp; 的，然后是函数中的局部变量。注意静态变量是不入栈的。&nbsp;&nbsp;&nbsp; <br>&nbsp; 当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地&nbsp; <br>&nbsp; 址，也就是主函数中的下一条指令，程序由该点继续运行。&nbsp;&nbsp;&nbsp; <br>&nbsp; 堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.6存取效率的比较&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; s1[]&nbsp;&nbsp; =&nbsp;&nbsp; "aaaaaaaaaaaaaaa";&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; *s2&nbsp;&nbsp; =&nbsp;&nbsp; "bbbbbbbbbbbbbbbbb";&nbsp;&nbsp;&nbsp; <br>&nbsp; aaaaaaaaaaa是在运行时刻赋值的；&nbsp;&nbsp;&nbsp; <br>&nbsp; 而bbbbbbbbbbb是在编译时就确定的；&nbsp;&nbsp;&nbsp; <br>&nbsp; 但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。&nbsp;&nbsp;&nbsp; <br>&nbsp; 比如：&nbsp;&nbsp;&nbsp; <br>&nbsp; #include&nbsp;&nbsp;&nbsp; <br>&nbsp; void&nbsp;&nbsp; main()&nbsp;&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; 1;&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; c[]&nbsp;&nbsp; =&nbsp;&nbsp; "1234567890";&nbsp;&nbsp;&nbsp; <br>&nbsp; char&nbsp;&nbsp; *p&nbsp;&nbsp; ="1234567890";&nbsp;&nbsp;&nbsp; <br>&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; c[1];&nbsp;&nbsp;&nbsp; <br>&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; p[1];&nbsp;&nbsp;&nbsp; <br>&nbsp; return;&nbsp;&nbsp;&nbsp; <br>&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp; 对应的汇编代码&nbsp;&nbsp;&nbsp; <br>&nbsp; 10:&nbsp;&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; c[1];&nbsp;&nbsp;&nbsp; <br>&nbsp; 00401067&nbsp;&nbsp; 8A&nbsp;&nbsp; 4D&nbsp;&nbsp; F1&nbsp;&nbsp; mov&nbsp;&nbsp; cl,byte&nbsp;&nbsp; ptr&nbsp;&nbsp; [ebp-0Fh]&nbsp;&nbsp;&nbsp; <br>&nbsp; 0040106A&nbsp;&nbsp; 88&nbsp;&nbsp; 4D&nbsp;&nbsp; FC&nbsp;&nbsp; mov&nbsp;&nbsp; byte&nbsp;&nbsp; ptr&nbsp;&nbsp; [ebp-4],cl&nbsp;&nbsp;&nbsp; <br>&nbsp; 11:&nbsp;&nbsp; a&nbsp;&nbsp; =&nbsp;&nbsp; p[1];&nbsp;&nbsp;&nbsp; <br>&nbsp; 0040106D&nbsp;&nbsp; 8B&nbsp;&nbsp; 55&nbsp;&nbsp; EC&nbsp;&nbsp; mov&nbsp;&nbsp; edx,dword&nbsp;&nbsp; ptr&nbsp;&nbsp; [ebp-14h]&nbsp;&nbsp;&nbsp; <br>&nbsp; 00401070&nbsp;&nbsp; 8A&nbsp;&nbsp; 42&nbsp;&nbsp; 01&nbsp;&nbsp; mov&nbsp;&nbsp; al,byte&nbsp;&nbsp; ptr&nbsp;&nbsp; [edx+1]&nbsp;&nbsp;&nbsp; <br>&nbsp; 00401073&nbsp;&nbsp; 88&nbsp;&nbsp; 45&nbsp;&nbsp; FC&nbsp;&nbsp; mov&nbsp;&nbsp; byte&nbsp;&nbsp; ptr&nbsp;&nbsp; [ebp-4],al&nbsp;&nbsp;&nbsp; <br>&nbsp; 第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到&nbsp; <br>&nbsp; edx中，再根据edx读取字符，显然慢了。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp; 2.7小结：&nbsp;&nbsp;&nbsp; <br>&nbsp; 堆和栈的区别可以用如下的比喻来看出：&nbsp;&nbsp;&nbsp; <br>&nbsp; 使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就&nbsp; <br>&nbsp; 走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自&nbsp; <br>&nbsp; 由度小。&nbsp;&nbsp;&nbsp; <br>&nbsp; 使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由&nbsp; <br>&nbsp; 度大。&nbsp;&nbsp; (经典！)&nbsp; </p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/hairetz/archive/2009/04/30/4141043.aspx">http://blog.csdn.net/hairetz/archive/2009/04/30/4141043.aspx</a></p>
<img src ="http://www.cppblog.com/micromichael/aggbug/112170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/micromichael/" target="_blank">micromichael</a> 2010-04-10 13:54 <a href="http://www.cppblog.com/micromichael/archive/2010/04/10/112170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高质量c/c++编程读书笔记(1)</title><link>http://www.cppblog.com/micromichael/archive/2010/04/09/112078.html</link><dc:creator>micromichael</dc:creator><author>micromichael</author><pubDate>Fri, 09 Apr 2010 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/micromichael/archive/2010/04/09/112078.html</guid><wfw:comment>http://www.cppblog.com/micromichael/comments/112078.html</wfw:comment><comments>http://www.cppblog.com/micromichael/archive/2010/04/09/112078.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/micromichael/comments/commentRss/112078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/micromichael/services/trackbacks/112078.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///I:%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:725252631;
mso-list-type:hybrid;
mso-list-template-ids:1255321694 -1190745840 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:%1．;
mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///I:%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:725252631;
mso-list-type:hybrid;
mso-list-template-ids:1255321694 -1190745840 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:%1．;
mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>1．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">为防止头文件被重复利用（通常发生在</span><span lang="EN-US">#include</span><span style="font-family: 宋体;">的嵌套中），应用</span><span lang="EN-US">#ifndef/#define/#endif</span><span style="font-family: 宋体;">产生预处理块。比如要防止</span><span lang="EN-US">graphics.h</span><span style="font-family: 宋体;">的头文件被重复利用，定义</span><span lang="EN-US">#ifndef GRAPHICS_H</span><span style="font-family: 宋体;">。（为什么用大写？）。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>2．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">好的命名规则：静态变量加前缀</span><span lang="EN-US">s_,</span><span style="font-family: 宋体;">全局变量加前缀</span><span lang="EN-US">g_</span><span style="font-family: 宋体;">，类的数据成员加前缀</span><span lang="EN-US">m_</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>3．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">不可将</span><span lang="EN-US">bool</span><span style="font-family: 宋体;">变量直接与</span><span lang="EN-US">TRUE,FALSE</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">1</span><span style="font-family: 宋体;">，</span><span lang="EN-US">0</span><span style="font-family: 宋体;">进行比较。区别于整型变量与零值比较。不可将浮点变量用&#8220;</span><span lang="EN-US">==</span><span style="font-family: 宋体;">&#8221;或&#8220;！</span><span lang="EN-US">=</span><span style="font-family: 宋体;">&#8221;与数字比较，应设法转化成&#8220;</span><span lang="EN-US">&gt;=</span><span style="font-family: 宋体;">&#8221;或&#8220;</span><span lang="EN-US">&lt;=</span><span style="font-family: 宋体;">&#8221;形式。应当将指针变量用&#8220;</span><span lang="EN-US">==</span><span style="font-family: 宋体;">&#8221;或&#8220;！</span><span lang="EN-US">=</span><span style="font-family: 宋体;">&#8221;与</span><span lang="EN-US">NULL</span><span style="font-family: 宋体;">比较，指针变量的零值为&#8220;空&#8221;（记为</span><span lang="EN-US">NULL</span><span style="font-family: 宋体;">）。尽管</span><span lang="EN-US">NULL</span><span style="font-family: 宋体;">的值与</span><span lang="EN-US">0</span><span style="font-family: 宋体;">相同，但两者的意义不同。（参考高质量</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">编程指南</span><span lang="EN-US">4.3</span><span style="font-family: 宋体;">节）。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>4．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">在多重循环中，如果有可能，应当将最长的循环放在最内层，最短的放在最外层，以减少</span><span lang="EN-US">CPU</span><span style="font-family: 宋体;">跨切循环层的次数。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>5．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">如果循环体内存在逻辑判断，并且循环次数很大，宜将逻辑判断移到循环体的外面。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>6．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span lang="EN-US">C</span><span style="font-family: 宋体;">语言用</span><span lang="EN-US">#define</span><span style="font-family: 宋体;">来定义常量（称为宏常量）。</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">语言除了</span><span lang="EN-US">#define</span><span style="font-family: 宋体;">外还可以用</span><span lang="EN-US">const</span><span style="font-family: 宋体;">来定义常量（称为</span><span lang="EN-US">const</span><span style="font-family: 宋体;">常量）。在</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">程序中只使用</span><span lang="EN-US">const</span><span style="font-family: 宋体;">常量而不使用宏常量，因为其相比</span><span lang="EN-US">#define</span><span style="font-family: 宋体;">来定义常量有更多的优点。</span><span lang="EN-US">Const</span><span style="font-family: 宋体;">常量有数据类型，而宏常量没有数据类型。因此编译器可以对前者进行安全检查。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>7．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">建立在整个类中都恒定的常量：别指望</span><span lang="EN-US">const</span><span style="font-family: 宋体;">数据成员了，应该用类中的枚举常量来实现。由于</span><span lang="EN-US">const</span><span style="font-family: 宋体;">数据成员只在某个对象生存期内是常量，而对整个类而言是可变的，因为类可以创建多个对象，不同对象其</span><span lang="EN-US">const</span><span style="font-family: 宋体;">数据成员值可以不同。枚举常量不会占用对象的存储空间，他们在编译时被全部求值。枚举常量的缺点是它的隐含数据类型是整数，其最大值有限，且不能表示浮点数。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>8．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">如果参数是指针，并且仅做输入用，则应在类型前加</span><span lang="EN-US">const</span><span style="font-family: 宋体;">，以防止该指针在函数体内被以外修改。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>9．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">函数名字与返回值类型在语义上不可冲突，违反这条规则的典型代表是</span><span lang="EN-US">C</span><span style="font-family: 宋体;">标准库函数</span><span lang="EN-US">getchar</span><span style="font-family: 宋体;">。由于</span><span lang="EN-US">getchar</span><span style="font-family: 宋体;">的原型为</span><span lang="EN-US">int getchar</span><span style="font-family: 宋体;">（</span><span lang="EN-US">void</span><span style="font-family: 宋体;">）。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>10．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-family: 宋体;">指针有些&#8220;似是而非&#8221;的特征：（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）指针消亡了，并不表示它所指的内存会被自动释放（</span><span lang="EN-US">2</span><span style="font-family: 宋体;">）内存被释放了，并不表示指针会消亡或者成为</span><span lang="EN-US">NULL</span><span style="font-family: 宋体;">指针。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]--><span lang="EN-US"><span>11．<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span lang="EN-US">exit</span><span style="font-family: 宋体;">（</span><span lang="EN-US">1</span><span style="font-family: 宋体;">）终止整个程序的运行？</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><!--[if !supportLists]-->
<meta http-equiv="Content-Type" content="text/html; charset="utf-8"">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///I:%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:725252631;
mso-list-type:hybrid;
mso-list-template-ids:1255321694 -1190745840 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:%1．;
mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]--></p><img src ="http://www.cppblog.com/micromichael/aggbug/112078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/micromichael/" target="_blank">micromichael</a> 2010-04-09 16:38 <a href="http://www.cppblog.com/micromichael/archive/2010/04/09/112078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>