﻿<?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++博客-习惯成自然-随笔分类-c++</title><link>http://www.cppblog.com/qzccan/category/15229.html</link><description>helloworld</description><language>zh-cn</language><lastBuildDate>Thu, 18 Nov 2010 08:28:47 GMT</lastBuildDate><pubDate>Thu, 18 Nov 2010 08:28:47 GMT</pubDate><ttl>60</ttl><item><title>STL版本（转）</title><link>http://www.cppblog.com/qzccan/archive/2010/11/15/133698.html</link><dc:creator>坏习惯</dc:creator><author>坏习惯</author><pubDate>Mon, 15 Nov 2010 11:41:00 GMT</pubDate><guid>http://www.cppblog.com/qzccan/archive/2010/11/15/133698.html</guid><wfw:comment>http://www.cppblog.com/qzccan/comments/133698.html</wfw:comment><comments>http://www.cppblog.com/qzccan/archive/2010/11/15/133698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qzccan/comments/commentRss/133698.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qzccan/services/trackbacks/133698.html</trackback:ping><description><![CDATA[<p>HP STL <br>HP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工作时，和Meng Lee共同完成的，是第一个STL的实现版本（参见1.2节）。这个STL是开放源码的，所以它允许任何人免费使用、复制、修改、发布和销售该软件和相关文档，前提是必须在所有相关文件中加入HP STL的版本信息和授权信息。现在已经很少直接使用这个版本的STL了。
<p>P.J. Plauger STL <a href="http://www.dinkumware.com/" target=_blank>http://www.dinkumware.com</a>。据称Visual Studio.NET中的Visual C++.NET（即VC7.0），对C++标准的支持有所提高，并且多了以哈希表（hash table）为基础而实现的map容器，multimap容器和set容器。
<p>P. J. Plauger STL属于个人作品，由P. J. Plauger本人实现，是HP STL的一个继承版本，因此在其所有头文件中都含有HP STL的相关声明，同时还有P. J. Plauger本人的版权声明。P. J. Plauger是标准C中stdio库的早期实现者，现在是C/C++ User's Journal的主编，与Microsoft保持着良好的关系。P. J. Plauger STL便是被用于Microsoft的Visual C++中的。在Windows平台下的同类版本中，其性能不错，但是queue组件（队列，一种容器）的效率不理想，同时由于Visual C++对C++语言标准的支持不是很好（至少直到VC6.0为止，还是如此），因此一定程度上影响了P. J. Plauger STL的性能。此外，该版本的源代码可读性较差，你可以在VC的Include子目录下找到所有源文件（比如：C:\Program Files\Microsoft Visual Studio\VC98\Include）。因为不是开放源码的（open source），所以这些源代码是不能修改和销售的，目前P.J. Plauger STL由Dinkumware公司提供相关服务，详情请见
<p>Rouge Wave STL <a href="http://www.rougewave.com/" target=_blank>http://www.rougewave.com</a>。遗憾的是该版本已有一段时间没有更新且不完全符合标准。因此在Borland C++ Builder 6.0中，它的地位被另一个STL的实现版本--STLport（见后）取代了。但是考虑到与以前版本的兼容，C++ Builder 6.0还是保留了Rouge Wave STL，只是如果你想查看它的源代码的话，需要在别的目录中才能找到（比如：C:\Program Files\Borland\Cbuilder6\Include\oldstl）。
<p>Rouge Wave STL是由Rouge Wave公司实现的，也是HP STL的一个继承版本，除了HP STL的相关声明之外，还有Rouge Wave公司的版权声明。同时，它也不是开放源码的，因此无法修改和销售。该版本被Borland C++ Builder所采用，你可以在C++ Builder的Include子目录下找到所有头文件（比如：C:\Program Files\Borland\Cbuilder5\Include）。尽管Rouge Wave STL的性能不是很好，但由于C++ Builder对C++语言标准的支持还算不错，使其表现在一定程度上得以改善。此外，其源代码的可读性较好。可以从如下网站得到更详细的情况介绍：
<p>STLport <a href="http://www.stlport.org/" target=_blank>http://www.stlport.org</a>，可以免费下载其源代码。STLport已经被C/C++技术委员会接受成为工业标准，且在许多平台上都支持。根据测试STLport的效率比VC中的STL要快。比Rouge Wave STL更符合标准，也更容易移植。Borland C++ Builder已经在其6.0版中加入了对STLport的支持，它使用的STLport就是4.5版的，C++ Builder 6.0同时还提供了STLport的使用说明。你可以在C++ Builder的Include\Stlport子目录下找到所有头文件（比如：C:\Program Files\Borland\Cbuilder6\Include\Stlport）。
<p>STLport最初源于俄国人Boris Fomitchev的一个开发项目，主要用于将SGI STL的基本代码移植到其他诸如C++Builder或者是Visual C++这样的主流编译器上。因为SGI STL属于开放源码，所以STLport才有权这样做。目前STLport的最新版本是4.5。可以从如下网站得到更详细的情况介绍：
<p>SGI STL <a href="http://www.sgi.com/" target=_blank>http://www.sgi.com</a>，可以免费下载其源代码。目前的最新版本是3.3。
<p>SGI STL是由Silicon Graphics Computer System, Inc公司实现的，其设计者和编写者包括Alexander Stepanov和Matt Austern，同样它也是HP STL的一个继承版本。它属于开放源码，因此你可以修改和销售它。SGI STL被GCC（linux下的C++编译器）所采用，你可以在GCC的Include子目录下找到所有头文件（比如：C:\cygnus\cygwin-b20\include\g++\include）。由于GCC对C++语言标准的支持很好，SGI STL在linux平台上的性能相当出色。此外，其源代码的可读性也很好。可以从如下网站得到更详细的情况介绍：
<p>本文来自CSDN博客，<a href="http://blog.csdn.net/nicole_q/archive/2007/11/04/1866889.aspx">http://blog.csdn.net/nicole_q/archive/2007/11/04/1866889.aspx</a></p>
<img src ="http://www.cppblog.com/qzccan/aggbug/133698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qzccan/" target="_blank">坏习惯</a> 2010-11-15 19:41 <a href="http://www.cppblog.com/qzccan/archive/2010/11/15/133698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针的赋值</title><link>http://www.cppblog.com/qzccan/archive/2010/11/02/132057.html</link><dc:creator>坏习惯</dc:creator><author>坏习惯</author><pubDate>Mon, 01 Nov 2010 16:23:00 GMT</pubDate><guid>http://www.cppblog.com/qzccan/archive/2010/11/02/132057.html</guid><wfw:comment>http://www.cppblog.com/qzccan/comments/132057.html</wfw:comment><comments>http://www.cppblog.com/qzccan/archive/2010/11/02/132057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qzccan/comments/commentRss/132057.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qzccan/services/trackbacks/132057.html</trackback:ping><description><![CDATA[<p>指针的赋值比较简单，但是粗心的话，还是比较容易弄错，小菜我比较粗心，就在一开始看到以下代码的时候，云里雾里的，一下没看明白为什么要用_Iterator_base ** 来实现这个功能。
<p>void __CLR_OR_THIS_CALL _Orphan_me()<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; // cut ties with parent<br>&nbsp;&nbsp;&nbsp; if (_Mycont != 0 &amp;&amp; _Mycont-&gt;_Myfirstiter != _IGNORE_MYITERLIST)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; // adopted, remove self from list<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Iterator_base **_Pnext =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (_Iterator_base **)&amp;_Mycont-&gt;_Myfirstiter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (*_Pnext != 0 &amp;&amp; *_Pnext != this)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Pnext = &amp;(*_Pnext)-&gt;_Mynextiter;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*_Pnext == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _DEBUG_ERROR("ITERATOR LIST CORRUPTED!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *_Pnext = _Mynextiter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Mycont = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }
<p>实话说，小弟我琢磨了好一会儿了，才恍然大悟，其实，换个例子相信大家一眼就看出来了
<p>int a = 100;<br>int b = 200;<br>int* pA = &amp;a;<br>int *pB = pA; *pB = 300;<br>pB = &amp;b; //pA指向的指针肯定是没有变的
<p>以pB为例，与pB对应的有&amp;pB, pB, *pB,三种值，如下
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/3%5B4%5D.jpg"><img title=3 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=65 alt=3 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/3%5B4%5D_thumb.jpg" width=401 border=0></a>
<p>0x0012fee8指pB的地址，这个地址的值是什么呢？？我们再看
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/4_2.jpg"><img title=4 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=439 alt=4 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/4_thumb.jpg" width=544 border=0></a>
<p>因为我们事先知道这个地址下是一个指针，在win32下指针32位,按高高低低原则，则这个地址的值是0x0012ff0c,假如这个地址表示的是一个字节如char,则值就是0x0c,如果两个字节，则0xff0c,如果3个字节(。。。需要字对齐吧)。还是因为我们事先知道这个内存是个指针，他的值是0x0012ff0c，那我们继续看看0x0012ff0c的值是多少</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/5_2.jpg"><img title=5 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=150 alt=5 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/5_thumb.jpg" width=547 border=0></a> </p>
<p>因为知道这个地址是int*指针，所以按int解释这个值就是 0x0000 0064 = 100了,</p>
<p>有了这几个图，那就可以看看 *pB = 300; pB = &amp;b到底改变了啥了</p>
<p>断点先断到*pb = 300后，继续看内存，发现执行好这句后</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/7_2.jpg"><img title=7 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=165 alt=7 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/7_thumb.jpg" width=545 border=0></a> </p>
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/6_2.jpg"><img title=6 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=124 alt=6 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/6_thumb.jpg" width=546 border=0></a> </p>
<p>0x12fee8的值没有变，还是0x12ff0c, 0x12ff0c的值变了，变为0x0000012c了</p>
<p>pB = &amp;b？</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/9_2.jpg"><img title=9 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=156 alt=9 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/9_thumb.jpg" width=543 border=0></a> </p>
<p><a href="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/10_2.jpg"><img title=10 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=156 alt=10 src="http://www.cppblog.com/images/cppblog_com/qzccan/WindowsLiveWriter/e738f7b7f6bd_14D8A/10_thumb.jpg" width=545 border=0></a> </p>
<p>&nbsp;</p>
<p>现在pB内存的值变为0x0012ff00了，而*pB的值就是内存0x0012FF00的值变为 0x000000c8了</p>
<p>好，看图说话到这里了，最后总结一下。初学者，很菜，多关照</p>
<img src ="http://www.cppblog.com/qzccan/aggbug/132057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qzccan/" target="_blank">坏习惯</a> 2010-11-02 00:23 <a href="http://www.cppblog.com/qzccan/archive/2010/11/02/132057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>