﻿<?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++博客-aa19870406-随笔分类-C/C++</title><link>http://www.cppblog.com/aa19870406/category/16145.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 12 Jul 2012 10:52:01 GMT</lastBuildDate><pubDate>Thu, 12 Jul 2012 10:52:01 GMT</pubDate><ttl>60</ttl><item><title>linux 文件操作之close</title><link>http://www.cppblog.com/aa19870406/archive/2012/07/12/183010.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Thu, 12 Jul 2012 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/07/12/183010.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/183010.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/07/12/183010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/183010.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/183010.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fcntl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_72_349_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_349_Open_Text.style.display='none'; Codehighlighter1_72_349_Closed_Image.style.display='inline'; Codehighlighter1_72_349_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_72_349_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_72_349_Closed_Text.style.display='none'; Codehighlighter1_72_349_Open_Image.style.display='inline'; Codehighlighter1_72_349_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_72_349_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_72_349_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;open(</span><span style="color: #000000">"</span><span style="color: #000000">demo.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;O_RDWR,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;fd1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;open(</span><span style="color: #000000">"</span><span style="color: #000000">demo1.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;O_RDWR,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">szMsg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;write(fd,&nbsp;szMsg,&nbsp;strlen(szMsg)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;size)<br /><img id="Codehighlighter1_276_317_Open_Image" onclick="this.style.display='none'; Codehighlighter1_276_317_Open_Text.style.display='none'; Codehighlighter1_276_317_Closed_Image.style.display='inline'; Codehighlighter1_276_317_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_276_317_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_276_317_Closed_Text.style.display='none'; Codehighlighter1_276_317_Open_Image.style.display='inline'; Codehighlighter1_276_317_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_276_317_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_276_317_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">error!</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;close(fd1);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>猜一下上面程序的执行结果。<br />在write时，fd和fd1的值是一样的，write fd时，实际就是write fd1。<br />为了避免自己在程序中误操作，可以在close(fd)之后，加上fd = -1; <img src ="http://www.cppblog.com/aa19870406/aggbug/183010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-07-12 16:13 <a href="http://www.cppblog.com/aa19870406/archive/2012/07/12/183010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64位网络字节序与主机字节序转换</title><link>http://www.cppblog.com/aa19870406/archive/2012/06/20/179517.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Wed, 20 Jun 2012 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/06/20/179517.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/179517.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/06/20/179517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/179517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/179517.html</trackback:ping><description><![CDATA[<p align="center"><span style="font-size: 18pt"><strong>&nbsp;64位网络字节序与主机字节序转换<br /><br /></strong></span></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;ntohll(unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;val)<br /><img id="Codehighlighter1_50_269_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_269_Open_Text.style.display='none'; Codehighlighter1_50_269_Closed_Image.style.display='inline'; Codehighlighter1_50_269_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_50_269_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_50_269_Closed_Text.style.display='none'; Codehighlighter1_50_269_Open_Image.style.display='inline'; Codehighlighter1_50_269_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_50_269_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_50_269_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(__BYTE_ORDER&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;__LITTLE_ENDIAN)<br /><img id="Codehighlighter1_91_207_Open_Image" onclick="this.style.display='none'; Codehighlighter1_91_207_Open_Text.style.display='none'; Codehighlighter1_91_207_Closed_Image.style.display='inline'; Codehighlighter1_91_207_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_91_207_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_91_207_Closed_Text.style.display='none'; Codehighlighter1_91_207_Open_Image.style.display='inline'; Codehighlighter1_91_207_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_91_207_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_91_207_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(((unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;)htonl((</span><span style="color: #0000ff">int</span><span style="color: #000000">)((val&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)))&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">)htonl((</span><span style="color: #0000ff">int</span><span style="color: #000000">)(val&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">));<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(__BYTE_ORDER&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;__BIG_ENDIAN)<br /><img id="Codehighlighter1_250_267_Open_Image" onclick="this.style.display='none'; Codehighlighter1_250_267_Open_Text.style.display='none'; Codehighlighter1_250_267_Closed_Image.style.display='inline'; Codehighlighter1_250_267_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_250_267_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_250_267_Closed_Text.style.display='none'; Codehighlighter1_250_267_Open_Image.style.display='inline'; Codehighlighter1_250_267_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_250_267_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_250_267_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;val;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;htonll(unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;val)<br /><img id="Codehighlighter1_322_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_541_Open_Text.style.display='none'; Codehighlighter1_322_541_Closed_Image.style.display='inline'; Codehighlighter1_322_541_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_322_541_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_322_541_Closed_Text.style.display='none'; Codehighlighter1_322_541_Open_Image.style.display='inline'; Codehighlighter1_322_541_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_322_541_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_322_541_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(__BYTE_ORDER&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;__LITTLE_ENDIAN)<br /><img id="Codehighlighter1_363_479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_363_479_Open_Text.style.display='none'; Codehighlighter1_363_479_Closed_Image.style.display='inline'; Codehighlighter1_363_479_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_363_479_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_363_479_Closed_Text.style.display='none'; Codehighlighter1_363_479_Open_Image.style.display='inline'; Codehighlighter1_363_479_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_363_479_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_363_479_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(((unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;)htonl((</span><span style="color: #0000ff">int</span><span style="color: #000000">)((val&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)))&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">)htonl((</span><span style="color: #0000ff">int</span><span style="color: #000000">)(val&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">));<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(__BYTE_ORDER&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;__BIG_ENDIAN)<br /><img id="Codehighlighter1_522_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_522_539_Open_Text.style.display='none'; Codehighlighter1_522_539_Closed_Image.style.display='inline'; Codehighlighter1_522_539_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_522_539_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_522_539_Closed_Text.style.display='none'; Codehighlighter1_522_539_Open_Image.style.display='inline'; Codehighlighter1_522_539_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_522_539_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_522_539_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;val;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/aa19870406/aggbug/179517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-06-20 16:50 <a href="http://www.cppblog.com/aa19870406/archive/2012/06/20/179517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何定义变长的TLV结构体？</title><link>http://www.cppblog.com/aa19870406/archive/2012/06/14/178803.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Thu, 14 Jun 2012 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/06/14/178803.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/178803.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/06/14/178803.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/178803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/178803.html</trackback:ping><description><![CDATA[<div style="text-align: center;"><strong style="font-size: 18pt; ">如何定义变长的TLV结构体？<br /><br /></strong></div>TLV是一种常用的用于通信的结构体格式。T表示tag，L表示length，V表示value。其中T和L是固定大小的，V是可变大小，L表示的是V的长度。通常用于结构化网络通信中的数据流。如0x3 3 'aa\0'，0x3 5 'aaaa\0',其中0x3表示tag的值，3 or 5表示的是后面的字符串的长度。由于V是可变长度的，所以在定义TLV结构时，需要将V定义成为可变大小。可定义如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span>&nbsp;TLV<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;value[0];<br />}__attribute__((packed));</div><br />注意value分配的是0大小，最后一个成员为可变长的数组，对于TLV（Type-Length-Value）形式的结构，或者其他需要变长度的结构体，用这种方式定义最好。使用起来非常方便，创建时，malloc一段结构体大小加上可变长数据长度的空间给它，可变长部分可按数组的方式访问，释放时，直接把整个结构体free掉就可以了。__attribute__(packed)用来强制不对struct TLV进行4字节对齐，目的是为了获取真实的TLV的空间使用情况。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*szMsg&nbsp;=&nbsp;"aaaaaaaaa";<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;<span style="color: #0000FF; ">sizeof</span>(TLV)&nbsp;&lt;&lt;&nbsp;endl;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">the&nbsp;size&nbsp;of&nbsp;TLV</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;len&nbsp;=&nbsp;strlen(szMsg)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;TLV&nbsp;*pTLV;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTLV&nbsp;=&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;TLV*)malloc(<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;TLV)&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">char</span>)*len);<br />&nbsp;&nbsp;&nbsp;&nbsp;pTLV-&gt;tag&nbsp;=&nbsp;0x2;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTLV-&gt;len&nbsp;=&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pTLV-&gt;value,&nbsp;szMsg,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;pTLV-&gt;value&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp; &nbsp; free(pTLV);<br />&nbsp; &nbsp; pTLV = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><br />这里有关于设置变长TLV的详细说明：<a href="http://www.douban.com/note/213324857/">http://www.douban.com/note/213324857/<br /></a><span style="color: red; "><strong>这里</strong></span><span style="color: red; "><strong>有一个问题，如何实现嵌套TLV结构呢？大家有什么好的思路吗？欢迎交流<br />简单实现了一下嵌套TLV，不知道有没有问题。<br /></strong></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;value[0];<br />}__attribute__&nbsp;((packed));<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;TLV<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;hei;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE&nbsp;value[0];<br />}&nbsp;__attribute__&nbsp;((packed));<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">char&nbsp;*szMsg&nbsp;=&nbsp;"aaaaaaaaaaa";</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;<span style="color: #0000FF; ">sizeof</span>(TLV)&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">uint16_t&nbsp;len&nbsp;=&nbsp;strlen(szMsg)&nbsp;+&nbsp;1;</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*szNodeMsg&nbsp;=&nbsp;"bbbbbbbbbb";<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;nodelen&nbsp;=&nbsp;strlen(szNodeMsg)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE&nbsp;*pNode&nbsp;=&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE&nbsp;*)&nbsp;malloc(<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE)&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">char</span>)*nodelen);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pNode-&gt;tag&nbsp;=&nbsp;0x3;<br />&nbsp;&nbsp;&nbsp;&nbsp;pNode-&gt;len&nbsp;=&nbsp;nodelen;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pNode-&gt;value,&nbsp;szNodeMsg,&nbsp;nodelen);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;TLV&nbsp;*pTlv;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16_t&nbsp;nodeSize&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;TLVNODE)&nbsp;+&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">char</span>)*nodelen;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTlv&nbsp;=&nbsp;(<span style="color: #0000FF; ">struct</span>&nbsp;TLV*)malloc(<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">struct</span>&nbsp;TLV)&nbsp;+&nbsp;nodeSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;pTlv-&gt;tag&nbsp;=&nbsp;0x2;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTlv-&gt;len&nbsp;=&nbsp;nodeSize;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;pTlv-&gt;value[0]&nbsp;=&nbsp;(struct&nbsp;TLVNODE)*pNode;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pTlv-&gt;value,&nbsp;pNode,&nbsp;nodeSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(pNode);<br />&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;<span style="color: #0000FF; ">sizeof</span>(*pTlv)&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTlv-&gt;value[i]&nbsp;=&nbsp;szMsg[i];&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">memcpy(pTlv-&gt;value,&nbsp;szMsg,&nbsp;len);</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">cout&nbsp;&lt;&lt;&nbsp;pTlv-&gt;value&nbsp;&lt;&lt;&nbsp;endl;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;free(pTlv);<br />&nbsp;&nbsp;&nbsp;&nbsp;pTlv&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><span style="color: red; "><strong><br /><br /><br /><br /></strong></span><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/aa19870406/aggbug/178803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-06-14 15:46 <a href="http://www.cppblog.com/aa19870406/archive/2012/06/14/178803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中const变量真的不可以修改吗？</title><link>http://www.cppblog.com/aa19870406/archive/2012/04/10/170836.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 10 Apr 2012 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2012/04/10/170836.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/170836.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2012/04/10/170836.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/170836.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/170836.html</trackback:ping><description><![CDATA[<div><div style="text-align: center;"><strong style="font-size: 18pt; ">c++中const变量真的不可以修改吗？<br /><br /></strong></div>在学c++的时候，看到的大部分的书籍对const关键字的介绍都是:const关键字修饰的变量的值是不可被修改的。但是事实真是如此吗？今天做了一个小的实验，发现const变量是可以被修改的。c++代码如下:<span style="font-size: 13px; ">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><br /><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 1081px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000ff; ">using</span>&nbsp;<span style="color: #0000ff; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">3</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;const_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">*&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">value&nbsp;of&nbsp;p:&nbsp;</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">value&nbsp;of&nbsp;a:&nbsp;</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">address&nbsp;of&nbsp;p:&nbsp;</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">"</span><span style="color: #000000; ">address&nbsp;of&nbsp;a:&nbsp;</span><span style="color: #000000; ">"</span>&nbsp;<span style="color: #000000; ">&lt;&lt;</span>&nbsp;<span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></div>上面代码第7行将a的地址赋值给指针p，然后第8行修改p所指向的地址中的值，运行结果如下：<br /><fieldset><legend>运行结果</legend><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">value of p: 4</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">value of a: 3</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">address of p: 0x7fbffff7fc</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff9900; background-color: #ffffff; ">address of a: 0x7fbffff7fc</span></div></div></fieldset>如上所示结果，指针p所指向的地址和变量a的地址相同，但是p所指地址中的值已经发生改变。但是为何变量a对应的地址中的值已经由3变为4，但是a的值确实3呢？<br />暂时把这个问题搁浅。再来看一下如下的c++代码：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">const&nbsp;int&nbsp;a&nbsp;=&nbsp;3;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;const_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">value&nbsp;of&nbsp;p:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">value&nbsp;of&nbsp;a:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">address&nbsp;of&nbsp;p:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">address&nbsp;of&nbsp;a:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">}</span></div>如上代码g++编译通过，在运行时报错如下：<br /><fieldset><legend>输出结果</legend><div><span style="color: red; ">Segmentation fault (core dumped)</span></div></fieldset>由此可见，在c++中全局const变量和局部const变量的编译器处理的方法是不一样的。查阅资料得知，全局const变量是不分配内存地址的，它编译器放置在符号表中作为编译期常量，全局const变量放在只读数据段中，受到只读数据段的权限保护，当你修改一个只读数据段中的内容时，会得到一个运行时错误。而局部const变量是放在堆栈之中，因为在内存中有地址，通过修改地址中的值可以达到修改const所指内存中值的目的。<br /></div> <div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/aa19870406/aggbug/170836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2012-04-10 23:49 <a href="http://www.cppblog.com/aa19870406/archive/2012/04/10/170836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>声明顺序，静态作用域，动态作用域</title><link>http://www.cppblog.com/aa19870406/archive/2011/06/18/148917.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Sat, 18 Jun 2011 09:37:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/06/18/148917.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/148917.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/06/18/148917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/148917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/148917.html</trackback:ping><description><![CDATA[为了说明c++的声明顺序所导致的作用域问题，考虑如下代码<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;//<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">map</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;//<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;first()<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;second()<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;first();<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">second:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num;<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;num;<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(num&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second();<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first();<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;a&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "></span></div>猜想一下上面的代码输出的结果是什么？main函数中输出的结果是1。不论你输入的num值是正数还是负数结果都是1。为什么会这样呢？这是因为c++采用的是静态作用域规则。第9行代码是关键所在。对于c++这种静态语言而言，第9行代码实际修改的是全局变量a的值。所以该程序的最终结果会是1。那么动态作用域规则的语言会输出什么样的结果呢？那就要根据所输入的num来决定了。<br /><br />c++声明变量的作用就是引进名字符号，表明该变量的作用域，而定义则是给变量分配内存，并且绑定值的过程。对于调用子函数的过程，为了找到子函数中的变量的声明作用域，编译器采用了静态链接的方法。对于程序的执行流程，编译器会维护一个栈，栈中会存储与相应调用函数对应的帧。编译器通过栈和帧数据结构来维护程序执行所调用的函数层次流程。要找到一个子函数中的变量声明域实际上就是在栈中相应帧中寻找该变量的声明。寻找起点是当前活动帧，而当前活动帧又通过静态链接（相当于指针）与它的父帧相关联。但是考虑上面的程序，当输入num大于0时，应该是先调用second，然后调用first，而second中对变量a重新进行了声明，如果栈中维护的层次是函数调用的层次，则此时first中修改的变量a应该是second中声明的变量a才是，那么结果输出应该是2，但是事实并非如此。所以我认为栈中的静态链接所链接的不是函数调用的层次，而是声明的层次。考虑上面的程序，全局变量a和函数first的声明是在同一层次的，则如果要寻找a中变量的声明，应该首先查找a所在的那个模块所对应的帧（姑且认为是全局帧吧，看成有一个全局范围的函数与之对应），则这时找到的a的声明应该就是全局变量a。所以如果按照这种分析的话，那么程序的结果就是1了。<br /><br />以上只是我的猜想，由于最近要忙于考试，没有时间查阅更多资料，且编译原理那块已经几乎忘得差不多了。如有错误请各位指正。<br /><br /><hr /><img src ="http://www.cppblog.com/aa19870406/aggbug/148917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-06-18 17:37 <a href="http://www.cppblog.com/aa19870406/archive/2011/06/18/148917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>准备研究一下redis</title><link>http://www.cppblog.com/aa19870406/archive/2011/06/14/148615.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Mon, 13 Jun 2011 16:36:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/06/14/148615.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/148615.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/06/14/148615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/148615.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/148615.html</trackback:ping><description><![CDATA[1.先从redis最初版本开始逐步研究<br />2.由于最近准备期末考试，所以每天晚上22:00-24:00学习2个小时<img src ="http://www.cppblog.com/aa19870406/aggbug/148615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-06-14 00:36 <a href="http://www.cppblog.com/aa19870406/archive/2011/06/14/148615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>01背包问题</title><link>http://www.cppblog.com/aa19870406/archive/2011/06/07/148170.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Mon, 06 Jun 2011 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/06/07/148170.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/148170.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/06/07/148170.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/148170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/148170.html</trackback:ping><description><![CDATA[<div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">algorithm</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;max(a,b)&nbsp;((a)&gt;(b))?(a):(b)</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">写出来之后，尝试把每一个for循环用for_each来替换。或者将公用的for流程用函数替代</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;PrintResult&nbsp;<br /></span><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i)<br /></span><span style="color: #008080; ">&nbsp;10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #000000; ">}printResult;<br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;15</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;PrintVecResult&nbsp;<br /></span><span style="color: #008080; ">&nbsp;16</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()(vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vec)<br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for_each(vec.begin(),&nbsp;vec.end(),&nbsp;printResult);<br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #000000; ">}printVecResult;<br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;knapsack(vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vecWeight,&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vecValue,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;capacity)<br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vecWeight.size();<br /></span><span style="color: #008080; ">&nbsp;27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;f(num,&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(capacity,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">&nbsp;28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;result(num,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;29</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</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; ">;<br /></span><span style="color: #008080; ">&nbsp;32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;num;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">&nbsp;33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;capacity;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">j)<br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(j&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;vecWeight[i])<br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;max(f[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][j],&nbsp;f[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][j</span><span style="color: #000000; ">-</span><span style="color: #000000; ">vecWeight[i]]&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;vecValue[i]);<br /></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[i][j]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;f[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][j];<br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">打印f数组表</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;for_each(f.begin(),&nbsp;f.end(),&nbsp;printVecResult);<br /></span><span style="color: #008080; ">&nbsp;48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">打印背包所能容纳的最大价值</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;50</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;f[num][capacity]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">&nbsp;51</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">打印产生最大价值的背包中物品的编号</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;53</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;capacity,&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;num;&nbsp;i&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">result[i]&nbsp;=&nbsp;f[i][j]&nbsp;&gt;&nbsp;f[i-1][j]&nbsp;?&nbsp;1&nbsp;:&nbsp;0;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(f[i][j]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;f[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][j])<br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;vecWeight[i];<br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;num;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">&nbsp;69</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;result[i])<br /></span><span style="color: #008080; ">&nbsp;71</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;74</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;&nbsp;f[num][capacity]&nbsp;;<br /></span><span style="color: #008080; ">&nbsp;76</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;capacity&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;num;<br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;capacity;<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;weight;<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;value;<br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;weight.push_back(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;value.push_back(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;90</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;num;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">&nbsp;92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;93</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tempWeight&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;94</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tempValue&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;tempWeight&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;tempValue;<br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weight.push_back(tempWeight);<br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.push_back(tempValue);<br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;knapsack(weight,&nbsp;value,&nbsp;capacity);<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #000000; ">}</span></div></div></div><img src ="http://www.cppblog.com/aa19870406/aggbug/148170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-06-07 00:55 <a href="http://www.cppblog.com/aa19870406/archive/2011/06/07/148170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计数排序</title><link>http://www.cppblog.com/aa19870406/archive/2011/06/04/148072.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Sat, 04 Jun 2011 15:50:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/06/04/148072.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/148072.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/06/04/148072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/148072.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/148072.html</trackback:ping><description><![CDATA[<div><div>计数排序实现：以学生年龄对学生信息进行排序。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">algorithm</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">typedef&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;StudentInfo&nbsp;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;age;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;name;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;major;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">}StudentInfo;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;StudentCount&nbsp;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()(StudentInfo&nbsp;stuInfo)<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;stuInfo.name&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;stuInfo.age&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;stuInfo.major&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">}student;<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Countsort(vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">StudentInfo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vec,&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nMaxAge)<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;nCount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)malloc(</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">nMaxAge);<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">vector&lt;unsigned&nbsp;int&gt;&nbsp;nCount(nMaxAge,&nbsp;0);</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;memset(nCount,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">nMaxAge);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">assign&nbsp;0&nbsp;to&nbsp;the&nbsp;array&nbsp;nCount</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">StudentInfo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::const_iterator&nbsp;iter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec.begin();<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">count&nbsp;the&nbsp;number&nbsp;of&nbsp;each&nbsp;age</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(;&nbsp;iter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vec.end();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">iter)&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">用for_each试一下</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">nCount[iter</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">age];<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">确定有多少个数据在当前元素的前面</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;nMaxAge;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCount[i]&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;nCount[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">StudentInfo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;StudentSorted;<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;StudentSorted.reserve(vec.size());&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">使用reserve预分配空间，这些空间是否有初始值呢？</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;StudentSorted.resize(vec.size());<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</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;vec.size();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">&nbsp;i)<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;index&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">nCount[vec[i].age];<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StudentSorted[index]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec[i];<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">将StudentSorted数据复制到vec中。</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vec.swap(StudentSorted);<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">for_each(vec.begin(),&nbsp;vec.end(),&nbsp;student);</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;free(nCount);<br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;nCount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">StudentInfo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vec;<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">初始化vec中的数据</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</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;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">i)<br /></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StudentInfo&nbsp;stuInfo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{i</span><span style="color: #000000; ">%</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">qinlei</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CS</span><span style="color: #000000; ">"</span><span style="color: #000000; ">};<br /></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vec.push_back(stuInfo);<br /></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始排序</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Countsort(vec,&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">打印排序后的结果</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;for_each(vec.begin(),&nbsp;vec.end(),&nbsp;student);<br /></span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #000000; ">}</span></div></div></div><img src ="http://www.cppblog.com/aa19870406/aggbug/148072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-06-04 23:50 <a href="http://www.cppblog.com/aa19870406/archive/2011/06/04/148072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++对象内存布局</title><link>http://www.cppblog.com/aa19870406/archive/2011/06/01/147889.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Wed, 01 Jun 2011 11:34:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/06/01/147889.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/147889.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/06/01/147889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/147889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/147889.html</trackback:ping><description><![CDATA[一直不明白c++中类中的函数和成员变量在实例化对象后在内存中究竟是个什么样的布局。一度以为一个对象的内存布局应该包括函数体和成员变量，后来才知道对象的内存布局是不包括函数体的。也就是说实例化一个类后，该对象占用的内存空间大小实际上是它的成员变量在内存中所占用空间大小（注意，含有静态成员变量和虚函数的类对象例外）。以下分析以下c++类对象在内存中的布局，并且探讨在给定一个类的成员变量的类型和数量时，如何使得类实例化后对象所占用的内存空间最小（考虑变量在内存中对齐）。<br />
先给出一个类，如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;A<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;A()<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">A</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">A()<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">~A</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;printA()<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">printA</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;c;<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;e;<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;b;<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(a)&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl; //输出是24<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">}</span></div><br />以上代码输出是：24。也就是说对象a占用内存空间大小是24字节，这个24字节是怎么得来的呢？我们注意到在类A中存在虚函数，而只有类中有虚函数存在，则可以知道，在每个类对象占用内存空间的首部都会有一个虚函数表，这个虚函数表可以看成是一个指针数组，在对象a中虚函数表中总共有2项，因为类A中存在两个虚函数，每个虚函数都在虚函数表中有一个项对应。现在我们知道虚函数表是2个指针的内存大小，所以是2*4=8字节。然后a,c,e总共占用4+1+1=6字节，由于需要进行内存对齐，所以实际上它占用的大小是8字节（即类对象中的内存按照占用内存空间最大的变量来对齐，static变量不考虑在内）。然后是b占用8字节，static变量d不占用空间，综上对象a占用空间大小为8（虚函数表）+8（a,c,e)+8(b)=24字节。具体可以在vs下调试，查看a的地址。<br /><br />由于要考虑到内存对齐，所以。。今天有事，以后待续<br /><img src ="http://www.cppblog.com/aa19870406/aggbug/147889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-06-01 19:34 <a href="http://www.cppblog.com/aa19870406/archive/2011/06/01/147889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源云计算技术系列（五）（崛起的黑马Sector/Sphere 实战篇)(转)</title><link>http://www.cppblog.com/aa19870406/archive/2011/05/30/147721.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Mon, 30 May 2011 14:46:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/05/30/147721.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/147721.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/05/30/147721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/147721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/147721.html</trackback:ping><description><![CDATA[<div><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><h3><div><a href="http://www.iteye.com/articles/359">http://www.iteye.com/articles/359</a></div></h3></span></div><img src ="http://www.cppblog.com/aa19870406/aggbug/147721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-05-30 22:46 <a href="http://www.cppblog.com/aa19870406/archive/2011/05/30/147721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL之iterator_traits</title><link>http://www.cppblog.com/aa19870406/archive/2011/05/30/147687.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Mon, 30 May 2011 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/05/30/147687.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/147687.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/05/30/147687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/147687.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/147687.html</trackback:ping><description><![CDATA[1.泛型编程，编译时绑定。对应OO的多态（运行时绑定)。<br />2.数据结构和算法的分离<br />3.STL左闭右开区间<br />4.<a href="http://www.cnblogs.com/jeedispeed/articles/1192614.html">http://www.cnblogs.com/jeedispeed/articles/1192614.html</a><img src ="http://www.cppblog.com/aa19870406/aggbug/147687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-05-30 12:01 <a href="http://www.cppblog.com/aa19870406/archive/2011/05/30/147687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>减少编译依赖</title><link>http://www.cppblog.com/aa19870406/archive/2011/05/27/147409.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Fri, 27 May 2011 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/05/27/147409.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/147409.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/05/27/147409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/147409.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/147409.html</trackback:ping><description><![CDATA[1.handle class<br />&nbsp; PImpl手法，隐藏实现细节。使用指针代替变量定义体。<br /><br />2.interface class<br />&nbsp; 使用abstract class,纯虚函数（pure function)，多态机制。用父类的接口调用具体子类对象的实现。<br /><br />3.头文件中只能有声明体，实现部分放到另一文件中。实现与声明分开-接口与实现分离。<br />&nbsp;&nbsp;<br /><img src ="http://www.cppblog.com/aa19870406/aggbug/147409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-05-27 21:43 <a href="http://www.cppblog.com/aa19870406/archive/2011/05/27/147409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关char指针的文章一篇</title><link>http://www.cppblog.com/aa19870406/archive/2011/05/03/145535.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 03 May 2011 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/05/03/145535.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/145535.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/05/03/145535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/145535.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/145535.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 18px; BORDER-COLLAPSE: collapse" class=Apple-style-span>
<table style="BORDER-COLLAPSE: collapse; TABLE-LAYOUT: fixed" border=0 cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td style="LINE-HEIGHT: 27px; COLOR: rgb(0,0,0); FONT-SIZE: 18px; FONT-WEIGHT: bold" class=article_title height=30 align=middle><strong>[文章] 有关char指针的文章一篇</strong></td>
        </tr>
        <tr>
            <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" bgColor=#888888 height=1 width="100%" align=middle></td>
        </tr>
        <tr>
            <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" height=2 width="100%"></td>
        </tr>
        <tr>
            <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" height=38 width="100%">
            <p align=center><strong>作者</strong>：未知<span class=Apple-converted-space>&nbsp;</span><strong>来源</strong>：月光软件站<span class=Apple-converted-space>&nbsp;</span><strong>加入时间</strong>：2005-2-28　月光软件站</p>
            </td>
        </tr>
        <tr>
            <td style="LINE-HEIGHT: 18px; FONT-SIZE: 9pt" vAlign=top width="100%"><font size=2 face=Tahoma><strong>[文章] 有关char指针的文章一篇（转自:</strong><a href="http://www.moon-soft.com/doc/9040.htm"><u><font color=#0066cc face=宋体>http://www.moon-soft.com/doc/9040.htm</font></u></a>)<br></font>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">先看以下代码:<span class=Apple-converted-space>&nbsp;</span><br>char *p;<span class=Apple-converted-space>&nbsp;</span><br>p="abc";<span class=Apple-converted-space>&nbsp;</span><br>你认为是对的吗?<span class=Apple-converted-space>&nbsp;</span><br><br>答案：语法上是对的，但不提倡这种写法。<span class=Apple-converted-space>&nbsp;</span><br><br>误区1：没有给p分配内存空间就赋值，怎么会是对的呢？<span class=Apple-converted-space>&nbsp;</span><br>正解：不少人第一眼将这里的p="abc"看成了*p="abc"，然后就做出了以上的论断。这是比较笨笨的错误咯：）<span class=Apple-converted-space>&nbsp;</span><br>看清楚就好啦，其实赋给p的是"abc"的地址。再说，*p="abc"也不对呀，字符串可不能这么赋值。<span class=Apple-converted-space>&nbsp;</span><br><br>误区2：这"abcd"哪来的地址,怎么能直接赋给p呢?<span class=Apple-converted-space>&nbsp;</span><br>正解：先自己试试吧。在2K/XP + VC下运行这段代码，是不会出错的，说明这段代码并无问题。晕吧？猜想的话呢，就是"abcd"不知道被放在了什么地方，然后弄来了一个地址，给了p。<span class=Apple-converted-space>&nbsp;</span><br><br>这到底是怎么回事呢？<span class=Apple-converted-space>&nbsp;</span><br><br>要知道，这两个语句和char *p="abc"是完全一样的，所以其中的道理也一样。<span class=Apple-converted-space>&nbsp;</span><br>char *p="abc"曾经迷惑了不少人呀。问问你：p到底是什么类型的？char *？错，是const char *！<span class=Apple-converted-space>&nbsp;</span><br>也就是说，它所指向的内容是不可改变的。不过要补充的是，a的指向是可以改变的。<span class=Apple-converted-space>&nbsp;</span><br>所以为了不再引起误会，char *p="abc这种写法是不提倡的。<span class=Apple-converted-space>&nbsp;</span><br>既然char *p="abcd"被建议写成const char *p="abcd"，那么char *p; p="abcd";也应该写成const char *p; p="abcd";<span class=Apple-converted-space>&nbsp;</span><br><br>讲来讲去，最后来得看看汇编代码。看完就明白是怎么回事了。（我才发现汇编代码原来这么爽看！VC下，没开编译器优化）：<span class=Apple-converted-space>&nbsp;</span><br>我们重点先看const char *p="abc"和char p[]="abc"有什么不同（都放在main()中声明）：<span class=Apple-converted-space>&nbsp;</span><br></font></p>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br>void&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br>}
            <br>
            <br></font><font color=#0000bb>3</font><font color=#007700>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br></font><font color=#0000bb>00401028&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;</font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset&nbsp;string&nbsp;</font><font color=#dd0000>"abc"&nbsp;</font><font color=#007700>(</font><font color=#0000bb>0041f01c</font><font color=#007700>)
            <br>
            <br></font><font color=#0000bb>void&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br>}
            <br>
            <br></font><font color=#0000bb>3</font><font color=#007700>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br></font><font color=#0000bb>00401028&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax</font><font color=#007700>,[</font><font color=#0000bb>string&nbsp;</font><font color=#dd0000>"abc"&nbsp;</font><font color=#007700>(</font><font color=#0000bb>0041f01c</font><font color=#007700>)]
            <br></font><font color=#0000bb>0040102D&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;</font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>eax<br></font>
            </font>
            </code><hr></pre>
            </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>看出差别了吗？上一段ASM用offset取"abc"的地址，然后赋给[ebp-4]，也就是p（下同）。<span class=Apple-converted-space>&nbsp;</span><br>而下一段ASM却转了一个弯，先把"abc"的地址转到寄存器eax，然后再转赋给p。<span class=Apple-converted-space>&nbsp;</span><br><br>有疑问了：为什么不和上面的一样，直接用offset？VC是很聪明的（废话，M$的东西呀），不用offset，恐怕就是用不了了。<span class=Apple-converted-space>&nbsp;</span><br>offset是一条伪指令，在编译的时候就已经把偏移量算好了。offset是无法执行间接寻址的计算的。<span class=Apple-converted-space>&nbsp;</span><br><br>说明了什么？<span class=Apple-converted-space>&nbsp;</span><br><br>const char *p="abc"中的"abc"，在编译期间就已经处理好，要了一块内存，存起来了！在把地址赋给p的时候，就可以直接用offset计算。<span class=Apple-converted-space>&nbsp;</span><br>而char p[]="abc"中的"abc"，是在运行期间动态分配内存给"abc"，然后再算出地址，赋给p。hehe，这同时也说明了数组和指针的等价性。<span class=Apple-converted-space>&nbsp;</span><br><br>我们再做一次实验，这一次我们把char p[]="abc"放在main()外，并在main()内用一个指针再指向p看看。<span class=Apple-converted-space>&nbsp;</span><br></font>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br>char&nbsp;p</font><font color=#007700>[]=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br>
            <br></font><font color=#0000bb>void&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>p</font><font color=#007700>;
            <br>}
            <br>
            <br></font><font color=#0000bb>5</font><font color=#007700>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>p</font><font color=#007700>;
            <br></font><font color=#0000bb>00401028&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;</font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset&nbsp;p&nbsp;</font><font color=#007700>(</font><font color=#0000bb>00421adc</font><font color=#007700>)<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>这回p[]的声明放在main()外，变成了全局变量。结果main()内的t取p的指针的时候，直接用offset可以计算出来。<span class=Apple-converted-space>&nbsp;</span><br><br>据小石头所说，字面值，const，static，inline，全局变量都是放在静态数据区的。（但我感觉似乎不是如此，只是全局变量和字符串在编译时就处理好放在一起）<span class=Apple-converted-space>&nbsp;</span><br><br>不难发现，p[]被声明成全局变量后，就可以直接用offset计算地址，说明静态数据区是编译时就已经处理好的。<br>再对照const char *p="abc"的ASM，我们马上想到："abc"就是被C/C++存在静态数据区中的！它的地址就是"abc"在静态数据区的地址！<span class=Apple-converted-space>&nbsp;</span><br><br>弄清了这个，有些问题也就可以想得通了。下面这种用法，看来不能说是错误的了，因为"abc"是在静态数据区的，生存期可以说是整个程序：<span class=Apple-converted-space>&nbsp;</span><br></font>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br></font><font color=#ff8000>#include "stdio.h"
            <br>
            <br></font><font color=#007700>const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>fun</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br>&nbsp;&nbsp;return&nbsp;</font><font color=#0000bb>p</font><font color=#007700>;
            <br>}
            <br>
            <br></font><font color=#0000bb>void&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>t</font><font color=#007700>=</font><font color=#0000bb>fun</font><font color=#007700>();
            <br>&nbsp;&nbsp;</font><font color=#0000bb>printf&nbsp;</font><font color=#007700>(</font><font color=#dd0000>"%s"</font><font color=#007700>,</font><font color=#0000bb>t</font><font color=#007700>);
            <br>}<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>看ASM：<span class=Apple-converted-space>&nbsp;</span><br></font>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br>5</font><font color=#007700>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p</font><font color=#007700>=</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br></font><font color=#0000bb>00401038&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;</font><font color=#007700>[</font><font color=#0000bb>ebp</font><font color=#007700>-</font><font color=#0000bb>4</font><font color=#007700>],</font><font color=#0000bb>offset&nbsp;string&nbsp;</font><font color=#dd0000>"%d"&nbsp;</font><font color=#007700>(</font><font color=#0000bb>0042001c</font><font color=#007700>)<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br>一样也是使用offset计算地址。<span class=Apple-converted-space>&nbsp;</span><br><br>C/C++给字符串的待遇真是太好了。为了一个字符串，几乎可以打破所有的指针规则。晕～～～～（完）<span class=Apple-converted-space>&nbsp;</span><br><br>附：第一次写这么长的文章，写得挺晕的。本来我的C/C++也不是很纯熟的，ASM也是一知半解，今天在CSDN上为这个问题郁闷了半天，和几个人讨论了一下，最后就写了这么一篇文章。希望大家赏脸看看～～～有错一定要指正啊！最后特别感谢小石头（想飞的菜鸟，骄傲的石头，菜菜，都是他咯），还有小阿哥（就是Kingzeus咯）的帮忙～～～～～～谢谢咯～～～～～～</font>
            <p>&#160;</p>
            <p>&#160;</p>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">__________________<br>小菜虎 -&gt; 菜菜的老虎</font></p>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><strong>骄傲的石头回复：</strong></font></p>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">堆几盘积木，心情好些了，所以再重新写一遍。<span class=Apple-converted-space>&nbsp;</span><br>关于字符串的这个问题，我一直在心里困惑着。所以呢，昨天就看了一下。<span class=Apple-converted-space>&nbsp;</span><br>以前回答别人的时候，总是很简单的回答，字符串就是const char *指针，指向它的入口地址。现在想来真是惭愧，虽然这个事实好象已经为大家所接受，甚至没有人探讨过这个问题！所以我相信我的发现对大家大多数是有好处的。<span class=Apple-converted-space>&nbsp;</span><br>首先请看以下代码<span class=Apple-converted-space>&nbsp;</span><br></font></p>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br></font><font color=#ff8000>#include &lt;iostream&gt;
            <br>#include &lt;iomanip&gt;
            <br>
            <br></font><font color=#0000bb>using&nbsp;namespace&nbsp;std</font><font color=#007700>;
            <br>
            <br></font><font color=#0000bb>int&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p&nbsp;</font><font color=#007700>=&nbsp;</font><font color=#0000bb>0</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p2&nbsp;</font><font color=#007700>=&nbsp;</font><font color=#0000bb>p</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</font><font color=#0000bb>0</font><font color=#007700>;
            <br>}<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>以上代码有问题吗？ 如果你说没有，请你试一下。很明显，这是有问题的。const是为了保证不变性，而你把他变成non const，肯定有错误或者警告，要么就要用const_cast转换。<span class=Apple-converted-space>&nbsp;</span><br>所以上面的代码不能通过编译。<span class=Apple-converted-space>&nbsp;</span><br><br>那么这就很明显的在lee的post里出现了问题，当然我以前也一直是这么认为，甚至很多人都是这么认为。难道这是编译器对字符串的特殊处理吗？ 还是其他的原因？<span class=Apple-converted-space>&nbsp;</span><br><br>于是我想看看究竟。就动用了RTTI，我飞快的键入了以下代码。<span class=Apple-converted-space>&nbsp;</span><br></font></p>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br></font><font color=#ff8000>#include &lt;iostream&gt;
            <br>#include &lt;iomanip&gt;
            <br>
            <br></font><font color=#0000bb>using&nbsp;namespace&nbsp;std</font><font color=#007700>;
            <br>
            <br></font><font color=#0000bb>int&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>cout&nbsp;</font><font color=#007700>&lt;&lt;&nbsp;</font><font color=#0000bb>typeid</font><font color=#007700>(</font><font color=#dd0000>"abc"</font><font color=#007700>).</font><font color=#0000bb>name</font><font color=#007700>()&nbsp;&lt;&lt;&nbsp;</font><font color=#0000bb>endl</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;return&nbsp;</font><font color=#0000bb>0</font><font color=#007700>;
            <br>}<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>你说结果是什么？<span class=Apple-converted-space>&nbsp;</span><br>是char [4]！而不是const char *;<span class=Apple-converted-space>&nbsp;</span><br>好，这个结果解决了我心中的疑点，原来是这样！这可以很简单的解释char *p = "abc"这个问题。 数组是一个char *const 指针，当然可以赋给char *指针而不会影响其常量性。所以这是完全正确的赋值。<span class=Apple-converted-space>&nbsp;</span><br>其实这想起来也很平常，指针是没有分配空间的地址而已，而数组是一种容器，占用连续的储存空间。想想字符串就该知道它是一个数组！而不是指针！真正意义上的指针只能是地址，而它在分配了连续的空间后可以作为数组来使用，这是由于他们的共性而决定的。<span class=Apple-converted-space>&nbsp;</span><br><br>哈哈！心情愉快，所以也接着看了下lee上面所做的探讨。字符串是放在静态储存区没错，毫无疑问。至于位置~ 偶不想多说，lee在上面分析了很多。所以我只对它进行了一下简单的测试。<span class=Apple-converted-space>&nbsp;</span><br>我手头上只有dev c++ 和 vc70编译器，所以就只用他们进行了测试。（打开了全部优化）<span class=Apple-converted-space>&nbsp;</span><br></font></p>
            <blockquote>
            <pre><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">PHP源码:</font><hr><code><font color=#000000>
            <font color=#0000bb><br></font><font color=#ff8000>#include &lt;iostream&gt;
            <br>#include &lt;iomanip&gt;
            <br>
            <br></font><font color=#0000bb>using&nbsp;namespace&nbsp;std</font><font color=#007700>;
            <br>
            <br></font><font color=#0000bb>int&nbsp;main</font><font color=#007700>()
            <br>{
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p&nbsp;</font><font color=#007700>=&nbsp;</font><font color=#dd0000>"abc"
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>char&nbsp;</font><font color=#007700>*</font><font color=#0000bb>p2&nbsp;</font><font color=#007700>=&nbsp;</font><font color=#dd0000>"abc"</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p</font><font color=#007700>[</font><font color=#0000bb>1</font><font color=#007700>]&nbsp;=&nbsp;</font><font color=#dd0000>'k'</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p2</font><font color=#007700>[</font><font color=#0000bb>1</font><font color=#007700>]&nbsp;=&nbsp;</font><font color=#dd0000>'j'
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>cout&nbsp;</font><font color=#007700>&lt;&lt;&nbsp;</font><font color=#0000bb>p1&nbsp;</font><font color=#007700>&lt;&lt;&nbsp;</font><font color=#0000bb>endl</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>cout&nbsp;</font><font color=#007700>&lt;&lt;&nbsp;</font><font color=#0000bb>p2&nbsp;</font><font color=#007700>&lt;&lt;&nbsp;</font><font color=#0000bb>endl</font><font color=#007700>;
            <br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</font><font color=#0000bb>0</font><font color=#007700>;
            <br>}<br></font><font color=#0000bb></font>
            </font>
            </code><hr></pre>
            </blockquote>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px"><br><br>结果呢？在dev c++下报错， 原因我想可能是因为在dev c++在对静态储存区进行了保护。而vc70下，通过，并且两个输出是不同的。所以偶去看vc70产生的msil码，原来vc70每次处理字符串都在静态区分配了空间，而且这两个"abc"是连续分配的！这里就没有出现Solmyr说的那种情况。我想一般比较好的编译器也应该这么说。至于vc60,偶没有测试，但是可能Solmyr说的情况会出现吧。但这样是不好的，相信这样会出现很多微妙的情况。<span class=Apple-converted-space>&nbsp;</span><br>所以，引用字符串的最佳格式是const char *指针，但char *指针是完全没错的。于情于理，也说的过去吧<img border=0 alt="" src="http://cpp.chinaccd.net/bbs/images/smilies/biggrin.gif"><span class=Apple-converted-space>&nbsp;</span>。<span class=Apple-converted-space>&nbsp;</span><br><br>如果你还要问，那用指针接受数组呢？ 呵呵，你该仔细看看前面了。相信这会给你帮助。</font></p>
            <p>&#160;</p>
            <p>&#160;</p>
            <p><font style="FONT-FAMILY: 'MS Shell Dlg', Tahoma, sans-serif, 宋体; FONT-SIZE: 12px">__________________<br><font color=blue>不可一日无酒无肉无女人</font></font></p>
            <img border=0 src="http://www.moon-soft.com/doc/down_info.asp?id=9040" width=1 height=1></td>
        </tr>
    </tbody>
</table>
</span></span>
<img src ="http://www.cppblog.com/aa19870406/aggbug/145535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-05-03 10:50 <a href="http://www.cppblog.com/aa19870406/archive/2011/05/03/145535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类中成员变量和成员函数在内存中的地址</title><link>http://www.cppblog.com/aa19870406/archive/2011/03/25/142735.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Fri, 25 Mar 2011 11:57:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/03/25/142735.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/142735.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/03/25/142735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/142735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/142735.html</trackback:ping><description><![CDATA[<p>#include &lt;iostream&gt;<br>using namespace std;</p>
<p>class Test<br>{<br>public:<br>&nbsp;int a;<br>&nbsp;int b;<br>&nbsp;void print();<br>&nbsp;void s();<br>&nbsp;void ss();<br>&nbsp;void fs();<br>};<br>void Test::print()<br>{<br>&nbsp;//cout &lt;&lt; "hello" &lt;&lt; endl;<br>}</p>
<p>void Test::s()<br>{</p>
<p>}</p>
<p>void Test::ss()<br>{</p>
<p>}<br>void Test::fs()<br>{</p>
<p>}</p>
<p><br>void f()<br>{<br>&nbsp;int s = 3;<br>&nbsp;cout &lt;&lt; "&amp;s" &lt;&lt; &amp;s &lt;&lt; endl;<br>&nbsp;cout &lt;&lt; "f" &lt;&lt; endl;<br>}</p>
<p>class B:Test<br>{</p>
<p>};</p>
<p>int main()<br>{<br>&nbsp;Test t;<br>&nbsp;cout &lt;&lt; sizeof(t) &lt;&lt; endl;<br>&nbsp;cout &lt;&lt; &amp;t.a &lt;&lt; endl;<br>&nbsp;cout &lt;&lt; &amp;t.b &lt;&lt; endl;<br>&nbsp;Test tt;<br>&nbsp;cout &lt;&lt; &amp;tt.a &lt;&lt; endl;<br>&nbsp;cout &lt;&lt; &amp;tt.b &lt;&lt; endl;<br>&nbsp;typedef void (Test::*p)(void);<br>&nbsp;////Test t;<br>&nbsp;////t.print();<br>&nbsp;p fun = &amp;Test::print;<br>&nbsp;printf("%p\n",fun);<br>&nbsp;fun = &amp;Test::s;<br>&nbsp;printf("%p\n",fun);</p>
<p>&nbsp;fun = &amp;Test::ss;<br>&nbsp;printf("%p\n",fun);<br>&nbsp;fun = &amp;Test::fs;<br>&nbsp;printf("%p\n",fun);<br>&nbsp;f();<br>&nbsp;cout &lt;&lt; "--------" &lt;&lt; endl;<br>&nbsp;B b;<br>&nbsp;cout &lt;&lt; sizeof(b) &lt;&lt; endl;<br>&nbsp;////((Test::*print)fun)();<br>&nbsp;//Test *p4;<br>&nbsp;//fun(p4);<br>&nbsp;//&nbsp; Test t;<br>&nbsp;//&nbsp; (t.*fun)();<br>&nbsp;//&nbsp; Test d;<br>&nbsp;//&nbsp; (d.*fun)();<br>}<br><br><br>类的成员函数不是在类实例化的时候载入内存的。应该是编译链接的时候就在程序文件中确定了相对地址。然后程序载入的时候，所有的函数都载入到内存的代码区。所以实例化对象的时候，只是申请了对象的成员变量的地址，成员函数对于所有的类对象来说，应该只有一份，在代码区共用。而且类的成员变量和成员函数不是存放在一起（地址不是连续的，是分开存放的）<br>Test类中的a,b变量地址是连续的，每个占4字节。但是s(),ss(),fs()不是和a,b连续的，而且，这些函数之间，好像也并不是严格连续的，改一下函数名，地址有可能会变化<br></p>
<img src ="http://www.cppblog.com/aa19870406/aggbug/142735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-03-25 19:57 <a href="http://www.cppblog.com/aa19870406/archive/2011/03/25/142735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Singleton的设计--经典</title><link>http://www.cppblog.com/aa19870406/archive/2011/03/09/141408.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Wed, 09 Mar 2011 04:36:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/03/09/141408.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/141408.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/03/09/141408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/141408.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/141408.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://www.techmango.com/blog/article/DotNet/Thread_Safe_Singleton_Instance.htm">http://www.techmango.com/blog/article/DotNet/Thread_Safe_Singleton_Instance.htm</a><br>许多同志都会采用一个double check的方式来创建一个Singleton：</p>
<p>public class Singleton<br>{<br>&nbsp;&nbsp;&nbsp; protected Singleton() { }<br>&nbsp;&nbsp;&nbsp; private static volatile Singleton instance = null;<br>&nbsp;&nbsp;&nbsp; /// Lazy方式创建唯一实例的过程<br>&nbsp;&nbsp;&nbsp; public static Singleton Instance()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (instance == null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 外层if<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock (typeof(Singleton))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 多线程中共享资源同步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (instance == null) // 内层if<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instance = new Singleton();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return instance;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;</p>
<p>这应该是比较经典的线程安全的Singleton创建方式，但是还是一个更加简单也很Cool的线程安全的Singleton：</p>
<p>class Singleton<br>{<br>&nbsp;&nbsp;&nbsp; private Singleton() { }<br>&nbsp;&nbsp;&nbsp; public static readonly Singleton Instance = new Singleton();<br>}<br>&nbsp;</p>
<p>　　它省去了上面示例中那个laze构造过程，由于Instance是类的公共静态成员，因此相当于它会在类第一次被用到的时候被构造，同样的原因也就可以省去把它放在静态构造函数里的过程。</p>
<p><br>这里实例构造函数被彻底定义为私有的，所以客户程序和子类无法额外构造新的实例，所有的访问通过公共静态成员Instance获得唯一实例的引用，符合Singleton的设计意图。</p>
<img src ="http://www.cppblog.com/aa19870406/aggbug/141408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-03-09 12:36 <a href="http://www.cppblog.com/aa19870406/archive/2011/03/09/141408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++学习之---volatile和线程安全的singleton模式</title><link>http://www.cppblog.com/aa19870406/archive/2011/03/09/141405.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Wed, 09 Mar 2011 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/03/09/141405.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/141405.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/03/09/141405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/141405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/141405.html</trackback:ping><description><![CDATA[<p>参考：<a href="http://www.cnblogs.com/rocketfan/archive/2009/12/05/1617759.html">http://www.cnblogs.com/rocketfan/archive/2009/12/05/1617759.html</a><br>volatile：<br>1.volatile的作用：<br>(1) the content of a volatile variable is &#8220;unstable&#8221; (can change by means unknown to the compiler),</p>
<p>(2) all writes to volatile data are &#8220;observable&#8221; so they must be executed religiously, and </p>
<p>(3) all operations on volatile data are executed in the sequence in which they appear in the source code.<br>1.被声明为volatile的变量其内容是不稳定的(unstable),它的值有可能由编译器所不能知晓的情况所改变。<br>2.所有对声明为volatile的变量的写操作都是可见的，必须严格执行be executed religiously。<br>3.所有对声明为volatile的变量的操作（读写）都必须严格按照源代码的顺序执行。<br>volatile确保每次直接从内存读取变量的值。java中的volatile是跨线程保证上述三个条件的，而C++只是单一线程内保证。<br>但是即使是JAVA能够跨越线程保证，仍然是不够的因为volatile和非volatile操作之间的顺序仍然是未定义的，有可能产生问题，考虑下面的代码：</p>
<p>volatile int vi;</p>
<p>void bar(void) {<br>vi = 1;<br>foo();<br>vi = 0;<br>}</p>
<p>我们一般会认为vi会在调用foo之前设置为1,调用完后会被置为0。然而编译器不会对你保证这一点，它会很高兴的将你的foo()移位，比如跑到vi = 1前面，只要它知道在foo()里不会涉及到其它的volatile操作。所以安全的方法是用<span style="COLOR: red">栅栏memory barrier</span>例如&#8220;asm volatile (&#8221;" ::: &#8220;memory&#8221;)加到foo的前面和后面 来保证严格的执行顺序。<span style="COLOR: red">内存屏障保证代码执行时严格按照源代码的的顺序。<br></span></p>
<img src ="http://www.cppblog.com/aa19870406/aggbug/141405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-03-09 11:47 <a href="http://www.cppblog.com/aa19870406/archive/2011/03/09/141405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>main函数之前干了神马？-谁调用了我的main</title><link>http://www.cppblog.com/aa19870406/archive/2011/03/08/141386.html</link><dc:creator>MrRightLeft</dc:creator><author>MrRightLeft</author><pubDate>Tue, 08 Mar 2011 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/aa19870406/archive/2011/03/08/141386.html</guid><wfw:comment>http://www.cppblog.com/aa19870406/comments/141386.html</wfw:comment><comments>http://www.cppblog.com/aa19870406/archive/2011/03/08/141386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aa19870406/comments/commentRss/141386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aa19870406/services/trackbacks/141386.html</trackback:ping><description><![CDATA[<p>(转载自<a href="http://topic.csdn.net/u/20101013/16/e5f2fcbb-528f-4b1a-b85c-aaa8aa9ab3b6.html">http://topic.csdn.net/u/20101013/16/e5f2fcbb-528f-4b1a-b85c-aaa8aa9ab3b6.html</a>）<br>main函数之前--真正的函数执行入口或开始</p>
<p>一种解释</p>
<p>实际上，在可执行文件被加载之后，控制权立即交给由编译器插入的Start函数，它将对后面这些全局变量进行准备：<br>　　　_osver 操作系统的构件编号<br>&nbsp; _winmajor　操作系统的主版本号<br>&nbsp; _winminor　操作系统的次版本号<br>&nbsp; _winver　操作系统完全版本号<br>&nbsp; __argc　命令行参数个数<br>　 __argv　指向参数字符串的指针数组<br>&nbsp; _environ　指向环境变量字符串的指针数组<br>Start函数初始化堆并调用main函数．mian函数返回之后,Start函数调用Exit函数结束该进程．<br>启动函数Start的源代码在：<br>　　　crt0.c Microsoft Visual C++<br>&nbsp; c0w.asm Borladn C++</p>
<p>另一种解释</p>
<p>Some of the stuff that has to happen before main():&nbsp;&nbsp; <br>set up initial stack pointer&nbsp;&nbsp; <br>initialize static and global data&nbsp;&nbsp; <br>zero out uninitialized data&nbsp;&nbsp; <br>run global constructors</p>
<p>Some of this comes with the runtime library's crt0.o file or its __start() function. Some of it you need to do yourself.<br>Crt0 is a synonym for the C runtime library.&nbsp;&nbsp; <br>Depending on the system you're using the follwing may be incomplete, but it should give you an idea. Using newlib-1.9.0/libgloss/m68k/crt0.S as an outline, the steps are:&nbsp;&nbsp; <br>1. Set stack pointer to value of __STACK if set&nbsp;&nbsp; <br>2. Set the initial value of the frame pointer&nbsp;&nbsp; <br>3. Clear .bss (where all the values that start at zero go)&nbsp;&nbsp; <br>4. Call indirect of hardware_init_hook if set to initialize hardware&nbsp;&nbsp; <br>5. Call indirect of software_init_hook if set to initialize software&nbsp;&nbsp; <br>6. Add __do_global_dtors and __FINI_SECTION__ to the atexit function so destructors and other cleanup functions are called when the program exits by either returning from main, or calling exit&nbsp;&nbsp; <br>7. setup the paramters for argc, argv, argp and call main&nbsp;&nbsp; <br>8. call exit if main returns</p>
<p>第三种解释：囫囵C语言（三）：谁调用了我的 main？<br>　　　　<br>　　　　现在最重要的是要跟得上潮流，所以套用比较时髦的话，谁动了我的奶酪。谁调用了我的 main？不过作为计算机工作者，我劝大家还是不要赶时髦，今天Java热，明天 .net 流行，什么时髦就学什么。我的意思是先花几年把基本功学好，等你赶时髦的时候也好事半功倍。废话不多说了。<br>　　　　<br>　　　　我们都听说过一句话：&#8220;main是C语言的入口&#8221;。我至今不明白为什么这么说。就好像如果有人说：&#8220;挣钱是泡妞&#8221;，肯定无数砖头拍过来。这句话应该是&#8220;挣钱是泡妞的一个条件，只不过这个条件特别重要&#8221;。那么上面那句话应该是 &#8220;main是C语言中一个符号，只不过这个符号比较特别。&#8221;<br>　　　　<br>　　　　我们看下面的例子：<br>　　　　<br>　　　　/* file name test00.c */<br>　　　　<br>　　　　int main(int argc, char* argv)<br>　　　　{<br>　　　　 return 0;<br>　　　　}<br>　　　　<br>　　　　编译链接它：<br>　　　　cc test00.c -o test.exe<br>　　　　会生成 test.exe<br>　　　　<br>　　　　但是我们加上这个选项： -nostdlib (不链接标准库)<br>　　　　cc test00.c -nostdlib -o test.exe<br>　　　　链接器会报错：<br>　　　　undefined symbol: __start<br>　　　　<br>　　　　也就是说：<br>　　　　1. 编译器缺省是找 __start 符号，而不是 main<br>　　　　2. __start 这个符号是程序的起始点<br>　　　　3. main 是被标准库调用的一个符号<br>　　　　<br>　　　　再来思考一个问题：<br>　　　　我们写程序，比如一个模块，通常要有 initialize 和 de-initialize，但是我们写 C 程序的时候为什么有些模块没有这两个过程么呢？比如我们程序从 main 开始就可以 malloc，free，但是我们在 main 里面却没有初始化堆。再比如在 main 里面可以直接 printf，可是我们并没有打开标准输出文件啊。(不知道什么是 stdin，stdout，stderr 以及 printf 和 stdout 关系的群众请先看看 C 语言中文件的概念)。<br>　　　　<br>　　　　有人说，这些东西不需要初始化。如果您真得这么想，请您不要再往下看了，我个人认为计算机软件不适合您。<br>　　　　<br>　　　　聪明的人民群众会想，一定是在 main 之前干了些什么。使这些函数可以直接调用而不用初始化。通常，我们会在编译器的环境中找到一个名字类似于 crt0.o 的文件，这个文件中包含了我们刚才所说的 __start 符号。（crt 大概是 C Runtime 的缩写，请大家帮助确认一下。）<br>　　　　<br>　　　　那么真正的 crt0.s 是什么样子呢？下面我们给出部分伪代码：<br>　　　　<br>　　　　///////////////////////////////////////////////////////<br>　　　　section .text:<br>　　　　__start:<br>　　　　<br>　　　　 :<br>　　　　 init stack;<br>　　　　 init heap;<br>　　　　 open stdin;<br>　　　　 open stdout;<br>　　　　 open stderr;<br>　　　　 :<br>　　　　 push argv;<br>　　　　 push argc;<br>　　　　 call _main; (调用 main)<br>　　　　 :<br>　　　　 destory heap;<br>　　　　 close stdin;<br>　　　　 close stdout;<br>　　　　 close stderr;<br>　　　　 :<br>　　　　 call __exit;<br>　　　　////////////////////////////////////////////////////<br>　　　　<br>　　　　实际上可能还有很多初始化工作，因为都是和操作系统相关的，笔者就不一一列出了。<br>　　　　<br>　　　　注意：<br>　　　　1. 不同的编译器，不一定缺省得符号都是 __start。<br>　　　　2. 汇编里面的 _main 就是 C 语言里面的 main，是因为汇编器和C编译器对符号的命名有差异（通常是差一个下划线'_'）。<br>　　　　3. 目前操作系统结构有两个主要的分支：微内核和宏内核。微内核的优点是，结构清晰，简单，内核组件较少，便于维护；缺点是，进程间通信较多，程序频繁进出内核，效率较低。宏内核正好相反。我说这个是什么目的是：没办法保证每个组件都在用户空间（标准库函数）中初始化，有些组件确实可能不要初始化，操作系统在创建进程的时候在内核空间做的。这依赖于操作系统的具体实现，比如堆，宏内核结构可能在内核初始化，微内核结构在用户空间；即使同样是微内核，这个东东也可能会被拿到内核空间初始化。<br>　　　　<br>　　　　随着 CPU 技术的发展，存储量的迅速扩展，代码复杂程度的增加，微内核被越来越多的采用。你会为了 10% 的效率使代码复杂度增加么？要知道每隔 18 个月 CPU 的速度就会翻一番。所以我对程序员的要求是，我首先不要你的代码效率高，我首先要你的代码能让 80% 的人迅速看懂并可以维护。</p>
<p>总结：</p>
<p>main函数执行之前，主要就是初始化系统相关资源：</p>
<p>1.设置栈指针</p>
<p>2.初始化static静态和global全局变量，即data段的内容</p>
<p>3.将未初始化部分的赋初值：数值型short，int，long等为0，bool为FALSE，指针为NULL，等等，即.bss段的内容</p>
<p>4.运行全局构造器，估计是C++中构造函数之类的吧</p>
<p>5.将main函数的参数，argc，argv等传递给main函数，然后才真正运行main函数</p>
<img src ="http://www.cppblog.com/aa19870406/aggbug/141386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aa19870406/" target="_blank">MrRightLeft</a> 2011-03-08 23:34 <a href="http://www.cppblog.com/aa19870406/archive/2011/03/08/141386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>