??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲va久久久噜噜噜久久天堂 ,国产高潮久久免费观看,久久丫精品国产亚洲avhttp://www.shnenglu.com/converse/category/803.html感兴领?高性能服务器编E?存储,法,Linux内核zh-cnTue, 06 Jul 2010 07:19:23 GMTTue, 06 Jul 2010 07:19:23 GMT60C++的流设计很糟p?/title><link>http://www.shnenglu.com/converse/archive/2010/07/06/119427.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 06 Jul 2010 05:04:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2010/07/06/119427.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/119427.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2010/07/06/119427.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/119427.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/119427.html</trackback:ping><description><![CDATA[最q需要提供一个功?采用cMC++输出的格式输出一些日志信? 例如Log(FATAL) << "log to" .<br><br>我找了两个类似项目来研究,google?a >glog</a> ?<a >log4cpp</a>, 它们都支持以C++输出格式进行输?<br><br>但是研究到最?我发现最大的问题? 如果按照C++的流输出格式q行输出, 无法判定需要输出的信息到哪里是l束.比如log << "hello " << "world",是无法判断到底在输出"hello"q是"world"的时候上面的参数输入已经l束?上面两个目? 解决q个问题的办法大致是相同?以下面可~译q行代码Z说明它们的做?在linux g++下面~译通过):<br> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include </span><span style="color: #000000;"><</span><span style="color: #000000;">iostream</span><span style="color: #000000;">></span><span style="color: #000000;"><br>#include </span><span style="color: #000000;"><</span><span style="color: #000000;">sstream</span><span style="color: #000000;">></span><span style="color: #000000;"><br><br>#ifdef __DEPRECATED<br></span><span style="color: #008000;">//</span><span style="color: #008000;"> Make GCC quiet.</span><span style="color: #008000;"><br></span><span style="color: #000000;"> # undef __DEPRECATED<br> # include </span><span style="color: #000000;"><</span><span style="color: #000000;">strstream</span><span style="color: #000000;">></span><span style="color: #000000;"><br> # define __DEPRECATED<br></span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br> # include </span><span style="color: #000000;"><</span><span style="color: #000000;">strstream</span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> std;<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> LoggerStream : </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> std::ostrstream {<br> </span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>  LoggerStream(</span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> buf, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> len)<br>   : ostrstream(buf, len),<br>    buf_(buf),<br>    len_(len) {<br>  }<br><br>  </span><span style="color: #000000;">~</span><span style="color: #000000;">LoggerStream() {<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;"> do the real fucking output</span><span style="color: #008000;"><br></span><span style="color: #000000;">    cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> buf_;<br>  }<br><br> </span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br>  </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;">buf_;<br>  </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> len_;<br>};<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main() {<br>  </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> buf[</span><span style="color: #000000;">100</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">};<br><br>  LoggerStream(buf, </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buf)) </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;"> hello world\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br>  cout </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">buf = </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> buf </span><span style="color: #000000;"><<</span><span style="color: #000000;"> endl;<br><br>  </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div> <br>在上面的代码? 开始进行输出的时候首先初始化一个LoggerStream对象, 而在输出参数输入完毕的时候将调用它的析构函数,在这个析构函C才完成真正的输出动作.也就是说,׃对输入参数结束位|判断手D늚~失,C++中不得不采用q个手段在析构函C完成最l的输出工作.<br>q样的做?最大的问题?频繁的构?析构开销?而且每个"<<"操作W背后又需要调用ostream的operator<<,也就是假如你的输入参数有三个调用operator <<三次(当然是经q重载的,不一定都是同一个operator<<),因此,假如需要考虑多线E的?那么一ơ输入有多个函数函数中被调用,仍然是问??要用这门语a写出正确的程序来,需要了解底下多的l节?!<br><br>最?我向目l反映这个问?一致同意以C中类似sprintf可变参数的Ş式实现这个功?可变参数解决q个问题,我的感觉而言,是输入参数的时?E显复杂,需要用h定输入的格式.然?其实q个做法也有好处:作ؓ函数的用?你必L的知道你在做什么ƈ且反馈给你所使用的函?明确?无歧义的使用函数,而不是依靠所谓函数重载猜你的用意,我想也是避免问题的一个手D?gcc? 提供了对可变参数查的机制,?a >q里</a>.<br><br> <img src ="http://www.shnenglu.com/converse/aggbug/119427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2010-07-06 13:04 <a href="http://www.shnenglu.com/converse/archive/2010/07/06/119427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解读google C++ code style谈对C++的理?/title><link>http://www.shnenglu.com/converse/archive/2010/05/29/116689.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 29 May 2010 12:34:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2010/05/29/116689.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/116689.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2010/05/29/116689.html#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/116689.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/116689.html</trackback:ping><description><![CDATA[ C++是一门够复杂的语言.说它"_复杂",是因为C++提供了够多~程范式--泛型, 模板, 面向对象, 异常,{等.Z说说,我已l很久没有跟qC++的最新发展了(比如C++0x), 所以前面列丑և来的Ҏ应该只是C++所有特性的一个部分Ş?C++Ҏ过多很N驭好C++的原因之一.另一个原因是C++q于"自作聪明",在很多地Ҏ无声息的做了很多事情, 比如隐式的类型{? 重蝲, 模板推导{等.而很多时?q些动作难以察觉,有时候会在你意想不到的地方发?即是熟l的C++E序员也隑օ被误?(关于了解C++~译器自作聪明做了哪些事? <<深入理解C++物g模型>>是不错的选择).<br><br>世界上有很多问题, Z知道如何去解?但是, gq还不算是最高明?更高明的做法是学会避免问题的发生.而如何避免问题的发生, 需要经验的U篏--曄犯下错误,吃一堑长一?于是知道哪些事情是不该做的或者是不应该这么做?<br><br><a >google C++ code style</a>是google对外公布的一份google内部~写C++的代码规范文?与其他很多我曄看过的编码文档一?里面有一些关于代码风格的规定,也就是代码的外观,q一部分不在q里q多讨论,毕竟代码如何才叫"观"是一个见仁见智的话题.在这里专门讨份文档中对一些C++Ҏ该如何使用的讨?最后再做一个ȝ.注意其中的序号ƈ不是文档中的序号,如果要详l了?可以自己ȝq䆾文档.<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">1</span><span style="color: #000000; ">) Static and Global Variables<br>   Static or global variables of </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> type are forbidden: they cause hard</span><span style="color: #000000; ">-</span><span style="color: #000000; ">to</span><span style="color: #000000; ">-</span><span style="color: #000000; ">find bugs due to indeterminate order of construction and destruction.</span></div>google明确止全局对象是类对象, 只能是所谓POD(Plain Old Data,如int char{?数据才行.因ؓC++标准中没有明规定全局对象的初始化序, 假设全局cd象A,B,其中A的初始化依赖于B的? 那么无法保证最后的l果.如果非要使用全局cd? 那么只能使用指针, 在main{函数入口统一q行初始?<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">2</span><span style="color: #000000; ">) Doing Work </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> Constructors<br>In general, constructors should merely </span><span style="color: #0000FF; ">set</span><span style="color: #000000; "> member variables to their initial values. Any complex initialization should go </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> an </span><span style="color: #0000FF; ">explicit</span><span style="color: #000000; "> Init() method. </span></div>文档规定, 在类构造函C对类成员对象做基本的初始化操? 所有的复杂初始化操作集中一个比如Init()的函C,理由如下:<br> <ul> <li> There is no easy way for constructors to signal errors, short of using exceptions (which are <a >forbidden</a>). </li> <li> If the work fails, we now have an object whose initialization code failed, so it may be an indeterminate state. </li> <li> If the work calls virtual functions, these calls will not get dispatched to the subclass implementations. Future modification to your class can quietly introduce this problem even if your class is not currently subclassed, causing much confusion. </li> <li> If someone creates a global variable of this type (which is against the rules, but still), the constructor code will be called before <code>main()</code>, possibly breaking some implicit assumptions in the constructor code. For instance, <a >gflags</a> will not yet have been initialized. </li> </ul> 单的概括h也就?构造函数没有返回? 难以让用者感知错?假如在构造函C调用虚拟函数, 则无法按照用者的x调用到对应子cM实现的虚拟函?理由是构造函数还未完成意味着q个对象q没有被成功构造完?.<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">3</span><span style="color: #000000; ">) Default Constructors<br>You must define a </span><span style="color: #0000FF; ">default</span><span style="color: #000000; "> constructor </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> your </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> defines member variables and has no other constructors. Otherwise the compiler will </span><span style="color: #0000FF; ">do</span><span style="color: #000000; "> it </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> you, badly. </span></div>当程序员没有为类~写一个默认构造函数的时? ~译器会自动生成一个默认构造函?而这个编译器生成的函数如何实?比如如何初始化类成员对象)是不定?q样,假如出现问题时将l调试跟t带来困?所? 规范要求每个c都需要编写一个默认构造函数避免这U情늚出现.<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">4</span><span style="color: #000000; ">) Explicit Constructors<br>Use the C</span><span style="color: #000000; ">++</span><span style="color: #000000; "> keyword </span><span style="color: #0000FF; ">explicit</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> constructors with one argument.</span></div>假如构造函数只有一个参? 使用explicit避免隐式转换, 因ؓ隐式转换可能在你q不需要的时候出?<br> <br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">5</span><span style="color: #000000; ">) Copy Constructors<br>Provide a copy constructor and assignment </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; "> only when necessary. Otherwise, disable them with DISALLOW_COPY_AND_ASSIGN.</span></div>只有当必要的时候才需要定义拷贝构造函数和赋值操作符. 同上一条理׃? 避免一些隐式的转换.另一条理由是,"="难以跟踪,如果真的要实现类似的功能,可以提供比如名ؓCopy()的函?q样子一目了?不会像赋值操作符那样可能在每?="出现的地方出?<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">6</span><span style="color: #000000; ">) Operator Overloading<br>Do not overload operators except </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> rare, special circumstances.</span></div>不要重蝲操作W?同样, 也是避免莫名其妙的调用了一些函?同上一条一? 比如要提供对"=="的重? 可以提供一个名为Equal()的函? 如果需要提供对"+"的重? 可以提供一个名为Add()的函?<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">7</span><span style="color: #000000; ">) Function Overloading<br>Use overloaded functions (including constructors) only </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> cases where input can be specified </span><span style="color: #0000FF; ">in</span><span style="color: #000000; "> different types that contain the same information. Do not use function overloading to simulate </span><span style="color: #0000FF; ">default</span><span style="color: #000000; "> function parameters.</span></div>只有在不同的cd表示同样的信息的时? 可以使用重蝲函数.其他情况?一律不能?使用重蝲, 也可能出C些隐式出现的转换.所? 在需要对不同函数q行同样操作的时? 可以在函数名UCq行区分, 而不是用重?如可以提供针对stringcd的AppendString()函数, 针对intcd的AppendInt()函数,而不是对string和intcd重蝲Append()函数.另一个好处在? 在阅M码时,通过函数名称可以一目了?<br><br><div style="background-color: rgb(238, 238, 238); font-size: 13px; border-left-color: rgb(204, 204, 204); 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: #000000; ">8</span><span style="color: #000000; ">) Exceptions<br>We </span><span style="color: #0000FF; ">do</span><span style="color: #000000; "> not use C</span><span style="color: #000000; ">++</span><span style="color: #000000; "> exceptions.</span></div>不用异?理由如下:<br> <ul> <li>When you add a <code>throw</code> statement to an existing function, you must examine all of its transitive callers. Either they must make at least the basic exception safety guarantee, or they must never catch the exception and be happy with the program terminating as a result. For instance, if <code>f()</code> calls <code>g()</code> calls <code>h()</code>, and <code>h</code> throws an exception that <code>f</code> catches, <code>g</code> has to be careful or it may not clean up properly.</li> <li>More generally, exceptions make the control flow of programs difficult to evaluate by looking at code: functions may return in places you don't expect. This results maintainability and debugging difficulties. You can minimize this cost via some rules on how and where exceptions can be used, but at the cost of more that a developer needs to know and understand.</li> <li>Exception safety requires both RAII and different coding practices. Lots of supporting machinery is needed to make writing correct exception-safe code easy. Further, to avoid requiring readers to understand the entire call graph, exception-safe code must isolate logic that writes to persistent state into a "commit" phase. This will have both benefits and costs (perhaps where you're forced to obfuscate code to isolate the commit). Allowing exceptions would force us to always pay those costs even when they're not worth it.</li> <li>Turning on exceptions adds data to each binary produced, increasing compile time (probably slightly) and possibly increasing address space pressure. </li> <li>The availability of exceptions may encourage developers to throw them when they are not appropriate or recover from them when it's not safe to do so. For example, invalid user input should not cause exceptions to be thrown. We would need to make the style guide even longer to document these restrictions!</li> </ul> 上面提到的理׃, 我认Z用异常最大的宛_是:异常的用导致了E序无法按照代码所展现的流E去走的, 比如代码里面写了步骤一二三,但是假如有异常出? q就不好预知代码真正步进的步骤了, 在出现问题时, l调试和跟踪带来困难.<br>另外, 我更喜欢unix API的设?熟悉unix~程的h都知? unix API基本上都遵守下列规则:<br>a) q回0表示成功, 其他(一般是-1)表示p|.<br>b) 在失败时, 可以Ҏerrno判断p|的原? q些在man手册中都是会清楚的描q?<br><br>ȝ一? q䆾规范中规避的C++Ҏ大致分Z下几c?<br>a) 避免使用那些没有定行ؓ的特?如全局变量不能是类对象(初始化顺序不定), 不用编译器生成的默认构造函?构造行Z定), 异常(代码走向不确?.<br>b) 避免使用那些隐式发生的操?如声明单参数构造函Cؓexplict以避免隐式{? 不定义拷贝构造函数避免隐式的拯行ؓ, 不用操作符重蝲避免隐式的{?br>c) Ҏ׃可的Ҏ给予明的规定:不用函数重载而是定义Ҏ个类型明的函数.<br>d) 即出错了程序也有办法知? 比如不能在类构造函Cq行复杂的构造操? 这些移动到cInit()的函C.<br><br>同时, q䆾文档中描q的大部分C++Ҏ? 都是我之前所熟悉?除了RTTI之外, 不过q里提到它也是要说明不用它,另外q提到boost, 不过也是说的要对?有限?的?比如里面的智能指?.可以看到, 面对q样一门复杂同时还在不停的发展更新Ҏ的语言, google的态度是比?保守"?q与我之前对C++的理解也是接q的, 我一直认为C++中需要用到的特性有基本的面向对?STL够?l过最q的~码实践,我认得加个智能指?.我对q个"保守"态度的理解是, 以C++当前的应用场景来? q些Ҏ已l? 如果使用其他一些更加复杂的, 对h的要求提高了, 代码的可L以及以后的可维护性就下降?<br><br>前面说过, 避免问题的出现比解决问题来的更加高明? 而面对C++q一个提供了众多Ҏ? google C++ code stylel予了明的规定, 也就是每个行? 如果都能做到有明的动作, 同时l果也都是可以预知的, 那么会将出问题的概率最大可能的降低, 即Z问题, 也容易跟t?<br><br>上面描述的ƈ不是q䆾文档中有关C++的所有内? 只不q我觉得q些更加有同感些, 详细的内? 可以参看q䆾文档.都知道google的作?质量有保? 除了人的素质实高之? 有规范的制度保证也是重要的原? 毕竟只要是h׃犯错, Z最大限度的避免人犯? 有一份详的代码规范, 写好哪些该做哪些不该做哪些不该这么做, 也是制度上的保证.另外, 假如每个人都能以一个比较高的标准要求自己所写的代码, 久而久? 获得q步也是必然的结?<br><br>从这套规范里? 我的另一个感悟是, 不论是什么行? "学会如何正确的做事情", 都是十分必要?q个"正确的做事情", 具体到编码来? 是代码规范里面提到的那些要?而除ȝ? 做Q何的事情, 使用正确的方式做? 都是可能少的避免错误的Ҏ.但是, "???是相对而言? 没有之前"?的经? ׃好体会什么叫"?.所? "如何正确的做?, 说到了最? q得看个人的l验U篏, 有了之前"错误"的经?才能吃一堑长一? "错误"q不是一无是处的, 只不q? q不是谁都去试着从中学习.<br><br><br> <img src ="http://www.shnenglu.com/converse/aggbug/116689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2010-05-29 20:34 <a href="http://www.shnenglu.com/converse/archive/2010/05/29/116689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Callback在C\C++中的实现http://www.shnenglu.com/converse/archive/2010/04/19/113023.html那谁那谁Mon, 19 Apr 2010 14:45:00 GMThttp://www.shnenglu.com/converse/archive/2010/04/19/113023.htmlhttp://www.shnenglu.com/converse/comments/113023.htmlhttp://www.shnenglu.com/converse/archive/2010/04/19/113023.html#Feedback8http://www.shnenglu.com/converse/comments/commentRss/113023.htmlhttp://www.shnenglu.com/converse/services/trackbacks/113023.html阅读全文

那谁 2010-04-19 22:45 发表评论
]]>
自己实现的memcpyhttp://www.shnenglu.com/converse/archive/2009/04/18/80316.html那谁那谁Sat, 18 Apr 2009 01:30:00 GMThttp://www.shnenglu.com/converse/archive/2009/04/18/80316.htmlhttp://www.shnenglu.com/converse/comments/80316.htmlhttp://www.shnenglu.com/converse/archive/2009/04/18/80316.html#Feedback12http://www.shnenglu.com/converse/comments/commentRss/80316.htmlhttp://www.shnenglu.com/converse/services/trackbacks/80316.html  阅读全文

那谁 2009-04-18 09:30 发表评论
]]>
服务器公共库开?-U程安全的singletonc? 可配|的U程锁管理类 http://www.shnenglu.com/converse/archive/2008/08/01/57798.html那谁那谁Fri, 01 Aug 2008 15:32:00 GMThttp://www.shnenglu.com/converse/archive/2008/08/01/57798.htmlhttp://www.shnenglu.com/converse/comments/57798.htmlhttp://www.shnenglu.com/converse/archive/2008/08/01/57798.html#Feedback0http://www.shnenglu.com/converse/comments/commentRss/57798.htmlhttp://www.shnenglu.com/converse/services/trackbacks/57798.html阅读全文

那谁 2008-08-01 23:32 发表评论
]]>
服务器公共库开?-dini文g格式的类http://www.shnenglu.com/converse/archive/2008/07/29/57383.html那谁那谁Mon, 28 Jul 2008 16:57:00 GMThttp://www.shnenglu.com/converse/archive/2008/07/29/57383.htmlhttp://www.shnenglu.com/converse/comments/57383.htmlhttp://www.shnenglu.com/converse/archive/2008/07/29/57383.html#Feedback7http://www.shnenglu.com/converse/comments/commentRss/57383.htmlhttp://www.shnenglu.com/converse/services/trackbacks/57383.html阅读全文

那谁 2008-07-29 00:57 发表评论
]]>
如何使用位操作得到大于N且ؓ2的次方的最的?/title><link>http://www.shnenglu.com/converse/archive/2008/06/21/54225.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 21 Jun 2008 07:36:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2008/06/21/54225.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/54225.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2008/06/21/54225.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/54225.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/54225.html</trackback:ping><description><![CDATA[     摘要: 如何使用位操作得到大于N且ؓ2的次方的最的?nbsp; <a href='http://www.shnenglu.com/converse/archive/2008/06/21/54225.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/54225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2008-06-21 15:36 <a href="http://www.shnenglu.com/converse/archive/2008/06/21/54225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(C++)一个愚蠢的错误http://www.shnenglu.com/converse/archive/2008/06/06/52390.html那谁那谁Fri, 06 Jun 2008 13:30:00 GMThttp://www.shnenglu.com/converse/archive/2008/06/06/52390.htmlhttp://www.shnenglu.com/converse/comments/52390.htmlhttp://www.shnenglu.com/converse/archive/2008/06/06/52390.html#Feedback22http://www.shnenglu.com/converse/comments/commentRss/52390.htmlhttp://www.shnenglu.com/converse/services/trackbacks/52390.html阅读全文

那谁 2008-06-06 21:30 发表评论
]]>
研究了一下SGI STL的内存算?/title><link>http://www.shnenglu.com/converse/archive/2008/04/01/45947.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 01 Apr 2008 11:55:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2008/04/01/45947.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/45947.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2008/04/01/45947.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/45947.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/45947.html</trackback:ping><description><![CDATA[     摘要: 仿SGI STL的内存池法. <br>  <a href='http://www.shnenglu.com/converse/archive/2008/04/01/45947.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/45947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2008-04-01 19:55 <a href="http://www.shnenglu.com/converse/archive/2008/04/01/45947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcache内存池的设计原理http://www.shnenglu.com/converse/archive/2008/01/21/41592.html那谁那谁Mon, 21 Jan 2008 15:34:00 GMThttp://www.shnenglu.com/converse/archive/2008/01/21/41592.htmlhttp://www.shnenglu.com/converse/comments/41592.htmlhttp://www.shnenglu.com/converse/archive/2008/01/21/41592.html#Feedback1http://www.shnenglu.com/converse/comments/commentRss/41592.htmlhttp://www.shnenglu.com/converse/services/trackbacks/41592.html
typedef struct {
    unsigned 
int size;      /* sizes of items */
    unsigned 
int perslab;   /* how many items per slab */

    void 
**slots;           /* list of item ptrs */
    unsigned 
int sl_total;  /* size of previous array */
    unsigned 
int sl_curr;   /* first free slot */

    void 
*end_page_ptr;         /* pointer to next free item at end of page, or 0 */
    unsigned 
int end_page_free; /* number of items remaining at end of last alloced page */

    unsigned 
int slabs;     /* how many slabs were allocated for this class */

    void 
**slab_list;       /* array of slab pointers */
    unsigned 
int list_size; /* size of prev array */

    unsigned 
int killing;  /* index+1 of dying slab, or zero if none */
} slabclass_t;

E序中有一个全局的数l?br>static slabclass_t slabclass[POWER_LARGEST + 1]用于保存slab,预分配内存池时调用的是void slabs_init(const size_t limit, const double factor) 函数,其中limit是内存池的最大容?factor是分配时的增长因?
比方?加入factor?,W一个在slabclass数组中的slab的每个item大小?28字节,那么下一个slab每个item的大就?28*2,再下一个就?28*2*2(注意,Z化问题的说明,上面没有考虑地址寚w的因?.

在预分配内存池时,最多给每个slab保存item的容量是1M内存,q个数值由#define POWER_BLOCK 1048576军_.
因此,slab中的几个元素在预分配内存时是q么定的:
size有一个v始?q个g后的增长由factor军_,增长的过E前面已l阐q过?
perslab保存的是一个slab存放的item数量,因此perslab = POWER_BLOCK / slabclass[i].size;
如果预先分配一D内存供使用的话,也就是没有定义DONT_PREALLOC_SLABS?那么p用slabs_preallocateq行预分配内?
其中,end_page_ptr指向q个预分配好的指?end_page_free表示的是目前I闲可用item的数?在预分配?q个gperslab相同.
在这个内存池模型?每个page实际上是一个数l?数组中每个元素的大小是q个slab中item的大?

另外,slots保存的是释放出来的item指针,sl_total表示ȝ数量,sl_curr表示的是目前可用的已l释攑և来的item数量.

每一ơ要分配内存的时?首先Ҏ需要分配的内存大小在slabclass数组中查扄引最的一个大于所要求内存的slab,如果slots不ؓI?那么׃q里q回内存,否则L找end_page_ptr,如果也没?那么只能返回NULL?
每一ơ释攑ֆ存的时?同样的找到应该返回内存的slab元素,改写前面提到的slot指针和sl_curr?

有点仓促,以后再完善~~




那谁 2008-01-21 23:34 发表评论
]]>
仿STL中的堆算法的一个实?/title><link>http://www.shnenglu.com/converse/archive/2007/03/20/20175.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 19 Mar 2007 16:28:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2007/03/20/20175.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/20175.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2007/03/20/20175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/20175.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/20175.html</trackback:ping><description><![CDATA[     摘要: 仿STL中的堆算法的一个实?nbsp; <a href='http://www.shnenglu.com/converse/archive/2007/03/20/20175.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/20175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2007-03-20 00:28 <a href="http://www.shnenglu.com/converse/archive/2007/03/20/20175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CGL开发手C一--参考资?/title><link>http://www.shnenglu.com/converse/archive/2007/03/18/20083.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 18 Mar 2007 11:40:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2007/03/18/20083.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/20083.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2007/03/18/20083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/20083.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/20083.html</trackback:ping><description><![CDATA[     摘要: 有关CGL写作中经常参考到的资?  <a href='http://www.shnenglu.com/converse/archive/2007/03/18/20083.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/20083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2007-03-18 19:40 <a href="http://www.shnenglu.com/converse/archive/2007/03/18/20083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Modern C++ Design(MCD)学习W记 && 试代码(?http://www.shnenglu.com/converse/archive/2007/02/04/18340.html那谁那谁Sun, 04 Feb 2007 15:18:00 GMThttp://www.shnenglu.com/converse/archive/2007/02/04/18340.htmlhttp://www.shnenglu.com/converse/comments/18340.htmlhttp://www.shnenglu.com/converse/archive/2007/02/04/18340.html#Feedback5http://www.shnenglu.com/converse/comments/commentRss/18340.htmlhttp://www.shnenglu.com/converse/services/trackbacks/18340.html  阅读全文

那谁 2007-02-04 23:18 发表评论
]]>
Modern C++ Design(MCD)学习W记 && 试代码(一)http://www.shnenglu.com/converse/archive/2007/02/04/18325.html那谁那谁Sun, 04 Feb 2007 07:53:00 GMThttp://www.shnenglu.com/converse/archive/2007/02/04/18325.htmlhttp://www.shnenglu.com/converse/comments/18325.htmlhttp://www.shnenglu.com/converse/archive/2007/02/04/18325.html#Feedback1http://www.shnenglu.com/converse/comments/commentRss/18325.htmlhttp://www.shnenglu.com/converse/services/trackbacks/18325.html阅读全文

那谁 2007-02-04 15:53 发表评论
]]>
little endian和big endian的概念解?判定与用?/title><link>http://www.shnenglu.com/converse/archive/2006/09/05/12058.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 05 Sep 2006 13:04:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2006/09/05/12058.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/12058.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2006/09/05/12058.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/12058.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/12058.html</trackback:ping><description><![CDATA[     摘要: little endian和big endian的概念解?判定与用?nbsp; <a href='http://www.shnenglu.com/converse/archive/2006/09/05/12058.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/12058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2006-09-05 21:04 <a href="http://www.shnenglu.com/converse/archive/2006/09/05/12058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试了一下VC和gcc对关键字export的支?/title><link>http://www.shnenglu.com/converse/archive/2006/07/11/9695.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 11 Jul 2006 11:04:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2006/07/11/9695.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/9695.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2006/07/11/9695.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/9695.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/9695.html</trackback:ping><description><![CDATA[     摘要: 试了一下VC和gcc对关键字export的支?nbsp; <a href='http://www.shnenglu.com/converse/archive/2006/07/11/9695.html'>阅读全文</a><img src ="http://www.shnenglu.com/converse/aggbug/9695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2006-07-11 19:04 <a href="http://www.shnenglu.com/converse/archive/2006/07/11/9695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探烦C++的秘密之?重蝲,覆盖,和隐? http://www.shnenglu.com/converse/archive/2006/03/24/4564.html那谁那谁Fri, 24 Mar 2006 12:39:00 GMThttp://www.shnenglu.com/converse/archive/2006/03/24/4564.htmlhttp://www.shnenglu.com/converse/comments/4564.htmlhttp://www.shnenglu.com/converse/archive/2006/03/24/4564.html#Feedback4http://www.shnenglu.com/converse/comments/commentRss/4564.htmlhttp://www.shnenglu.com/converse/services/trackbacks/4564.html阅读全文

那谁 2006-03-24 20:39 发表评论
]]>
使用typename的一个说?/title><link>http://www.shnenglu.com/converse/archive/2006/03/22/4476.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 22 Mar 2006 15:41:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2006/03/22/4476.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/4476.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2006/03/22/4476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/4476.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/4476.html</trackback:ping><description><![CDATA[时常看到q样的代?比如以下q两D代?<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">list</span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">::iterator iter1;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />list</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">::iterator iter1;</span></div><br />前者没有问题可以顺利的~译q去Q但是后者时怼报一个警告,Z么呢?<br />原因如下:<br />首先,list<T>是一个模板类Q在模板实例化以前是无法定L正的cd?也就是说~译阶段是无法知道到底是哪个cȝ,那么可能出现以下一U情况:某个cM恰好有一个静态成员ؓiteratorQ此时就会出错了?br />因此Z明确的指是一个类型而不是一个成员,我们需要在前面加上typenameQ也是:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">typename list</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">::iterator iter1;</span></div>typename在这里用于说明后面紧跟着的字W串表示的是一个类型?img src ="http://www.shnenglu.com/converse/aggbug/4476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2006-03-22 23:41 <a href="http://www.shnenglu.com/converse/archive/2006/03/22/4476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模板套模板~?/title><link>http://www.shnenglu.com/converse/archive/2006/03/22/4445.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 21 Mar 2006 16:06:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2006/03/22/4445.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/4445.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2006/03/22/4445.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/4445.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/4445.html</trackback:ping><description><![CDATA[ <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">iostream</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">map</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #0000ff">string</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">using</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">namespace</span> <span style="COLOR: #000000"> std;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_87_263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_263_Open_Text.style.display='none'; Codehighlighter1_87_263_Closed_Image.style.display='inline'; Codehighlighter1_87_263_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_87_263_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_263_Closed_Text.style.display='none'; Codehighlighter1_87_263_Open_Image.style.display='inline'; Codehighlighter1_87_263_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_87_263_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_87_263_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    map</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #0000ff">string</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> map1;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    map</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #0000ff">string</span> <span style="COLOR: #000000">, map</span> <span style="COLOR: #000000"><</span> <span style="COLOR: #0000ff">string</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> map2;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    map1[</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">] </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    map2[</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test1</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">] </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> map1;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    cout </span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000"> map2[</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test1</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">][</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">test</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">] </span> <span style="COLOR: #000000"><<</span> <span style="COLOR: #000000"> endl;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div>以上代码单的实现了map?二维"形式的支?很简?不是么?可是我第一ơ面对这个问题的时候模板套模板的整p涂?记录一个留个念惻I?img src ="http://www.shnenglu.com/converse/aggbug/4445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2006-03-22 00:06 <a href="http://www.shnenglu.com/converse/archive/2006/03/22/4445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于时对象和虚拟析构函数的问?/title><link>http://www.shnenglu.com/converse/archive/2006/02/16/3297.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Thu, 16 Feb 2006 15:24:00 GMT</pubDate><guid>http://www.shnenglu.com/converse/archive/2006/02/16/3297.html</guid><wfw:comment>http://www.shnenglu.com/converse/comments/3297.html</wfw:comment><comments>http://www.shnenglu.com/converse/archive/2006/02/16/3297.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/converse/comments/commentRss/3297.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/converse/services/trackbacks/3297.html</trackback:ping><description><![CDATA[在CU?别h问到q样的一个问?大致如下:<BR><BR><FONT size=2><FONT color=#0000ff> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000">iostream</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top>#include </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">namespace</SPAN><SPAN style="COLOR: #000000"> std;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_70_210_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_210_Open_Text.style.display='none'; Codehighlighter1_70_210_Closed_Image.style.display='inline'; Codehighlighter1_70_210_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_70_210_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_210_Closed_Text.style.display='none'; Codehighlighter1_70_210_Open_Image.style.display='inline'; Codehighlighter1_70_210_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_70_210_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_70_210_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG id=Codehighlighter1_124_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_153_Open_Text.style.display='none'; Codehighlighter1_124_153_Closed_Image.style.display='inline'; Codehighlighter1_124_153_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_124_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_153_Closed_Text.style.display='none'; Codehighlighter1_124_153_Open_Image.style.display='inline'; Codehighlighter1_124_153_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> print()</SPAN><SPAN id=Codehighlighter1_124_153_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_124_153_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">base::print()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">virtual ~base(){}</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">增加虚析构函敎ͼ导致输Z一致?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> derived :</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_240_329_Open_Image onclick="this.style.display='none'; Codehighlighter1_240_329_Open_Text.style.display='none'; Codehighlighter1_240_329_Closed_Image.style.display='inline'; Codehighlighter1_240_329_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_240_329_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_240_329_Closed_Text.style.display='none'; Codehighlighter1_240_329_Open_Image.style.display='inline'; Codehighlighter1_240_329_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_240_329_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_240_329_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG id=Codehighlighter1_294_327_Open_Image onclick="this.style.display='none'; Codehighlighter1_294_327_Open_Text.style.display='none'; Codehighlighter1_294_327_Closed_Image.style.display='inline'; Codehighlighter1_294_327_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_294_327_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_294_327_Closed_Text.style.display='none'; Codehighlighter1_294_327_Open_Image.style.display='inline'; Codehighlighter1_294_327_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> print()</SPAN><SPAN id=Codehighlighter1_294_327_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_294_327_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">devrived::print()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> argc, </SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">argv[])<BR><IMG id=Codehighlighter1_365_498_Open_Image onclick="this.style.display='none'; Codehighlighter1_365_498_Open_Text.style.display='none'; Codehighlighter1_365_498_Closed_Image.style.display='inline'; Codehighlighter1_365_498_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_365_498_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_365_498_Closed_Text.style.display='none'; Codehighlighter1_365_498_Open_Image.style.display='inline'; Codehighlighter1_365_498_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_365_498_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_365_498_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"> p1</SPAN><SPAN style="COLOR: #000000">=&</SPAN><SPAN style="COLOR: #000000">derived();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        p1</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        derived d;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"> p2</SPAN><SPAN style="COLOR: #000000">=&</SPAN><SPAN style="COLOR: #000000">d;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        p2</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV><BR><BR></FONT>加入虚拟析构函数后,输出为:<BR>base::print()<BR>devrived::print()<BR>不加入虚拟析构函敎ͼ输出则ؓQ?BR>devrived::print()<BR>devrived::print()</FONT><BR><BR><BR>我的解释如下:<BR><FONT size=2>实际?W一个赋值指向的是一个时对?加入与没有加入虚拟析构函数的区别在于:加入之后,在derivedcM会合成一个析构函C便调用base的虚拟析构函?如果没有加入的话那么׃会合成这个析构函?所有的资源在main函数l束之后才回?<BR><BR>因此,对于代码: base* p1=&derived();<BR>没有加入虚拟析构函数的时候因为derived()函数生成的时对象没有被销?因此对它的调用是对derived的调?当加入虚拟析构函C?derived()函数生成的时对象在以上的赋值完成之后就会调用析构函数进行析?q个时候再ơ对p1调用print函数?因ؓ临时对象已经析构,那么q个调用是对base的调用了.<BR><BR>我做了一个实验的代码,加了一些东?大家看看~~<BR><BR></FONT> <div id="ldxhpzj" class=smalltxt style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em; MARGIN-RIGHT: 2em"> <DIV style="FLOAT: left"></DIV> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000">iostream</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top>#include </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">namespace</SPAN><SPAN style="COLOR: #000000"> std;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_70_229_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_229_Open_Text.style.display='none'; Codehighlighter1_70_229_Closed_Image.style.display='inline'; Codehighlighter1_70_229_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_70_229_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_229_Closed_Text.style.display='none'; Codehighlighter1_70_229_Open_Image.style.display='inline'; Codehighlighter1_70_229_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_70_229_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_70_229_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG id=Codehighlighter1_124_153_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_153_Open_Text.style.display='none'; Codehighlighter1_124_153_Closed_Image.style.display='inline'; Codehighlighter1_124_153_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_124_153_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_153_Closed_Text.style.display='none'; Codehighlighter1_124_153_Open_Image.style.display='inline'; Codehighlighter1_124_153_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> print()</SPAN><SPAN id=Codehighlighter1_124_153_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_124_153_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">base::print()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_186_208_Open_Image onclick="this.style.display='none'; Codehighlighter1_186_208_Open_Text.style.display='none'; Codehighlighter1_186_208_Closed_Image.style.display='inline'; Codehighlighter1_186_208_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_186_208_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_186_208_Closed_Text.style.display='none'; Codehighlighter1_186_208_Open_Image.style.display='inline'; Codehighlighter1_186_208_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">()</SPAN><SPAN id=Codehighlighter1_186_208_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_186_208_Open_Text><SPAN style="COLOR: #000000">{cout </SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">~base()\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;}</SPAN></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">增加虚析构函敎ͼ导致输Z一致?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> derived :</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_259_430_Open_Image onclick="this.style.display='none'; Codehighlighter1_259_430_Open_Text.style.display='none'; Codehighlighter1_259_430_Closed_Image.style.display='inline'; Codehighlighter1_259_430_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_259_430_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_259_430_Closed_Text.style.display='none'; Codehighlighter1_259_430_Open_Image.style.display='inline'; Codehighlighter1_259_430_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_259_430_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_259_430_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG id=Codehighlighter1_313_346_Open_Image onclick="this.style.display='none'; Codehighlighter1_313_346_Open_Text.style.display='none'; Codehighlighter1_313_346_Closed_Image.style.display='inline'; Codehighlighter1_313_346_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_313_346_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_313_346_Closed_Text.style.display='none'; Codehighlighter1_313_346_Open_Image.style.display='inline'; Codehighlighter1_313_346_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> print()</SPAN><SPAN id=Codehighlighter1_313_346_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_313_346_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">devrived::print()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><<</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">virtual ~derived(){cout << "~derived()\n";}</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">增加虚析构函敎ͼ导致输Z一致?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> argc, </SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">argv[])<BR><IMG id=Codehighlighter1_467_933_Open_Image onclick="this.style.display='none'; Codehighlighter1_467_933_Open_Text.style.display='none'; Codehighlighter1_467_933_Closed_Image.style.display='inline'; Codehighlighter1_467_933_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_467_933_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_467_933_Closed_Text.style.display='none'; Codehighlighter1_467_933_Open_Image.style.display='inline'; Codehighlighter1_467_933_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_467_933_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.shnenglu.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_467_933_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        derived </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">t </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">&</SPAN><SPAN style="COLOR: #000000">derived();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"> p1 </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> t;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        p1</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        derived d;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"> p2</SPAN><SPAN style="COLOR: #000000">=&</SPAN><SPAN style="COLOR: #000000">d;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        p2</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> W一部分相当于以下的代码<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 用temp模拟临时对象</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">        derived temp;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        derived </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">s </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">&</SPAN><SPAN style="COLOR: #000000">temp;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">p3 </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> s;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> q次调用是对derived的函数调?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">        p3</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 昑ּ地对tempq行析构</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">        temp.</SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">::</SPAN><SPAN style="COLOR: #000000">~</SPAN><SPAN style="COLOR: #0000ff">base</SPAN><SPAN style="COLOR: #000000">();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 析构完后,同样的一个内?却是用base指针去解?<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> 因此调用的是base的函?/SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">        p3</SPAN><SPAN style="COLOR: #000000">-></SPAN><SPAN style="COLOR: #000000">print();<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> </SPAN></DIV></DIV><img src ="http://www.shnenglu.com/converse/aggbug/3297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/converse/" target="_blank">那谁</a> 2006-02-16 23:24 <a href="http://www.shnenglu.com/converse/archive/2006/02/16/3297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探烦C++的秘密之一详解extern "C"http://www.shnenglu.com/converse/archive/2006/01/14/2733.html那谁那谁Sat, 14 Jan 2006 15:52:00 GMThttp://www.shnenglu.com/converse/archive/2006/01/14/2733.htmlhttp://www.shnenglu.com/converse/comments/2733.htmlhttp://www.shnenglu.com/converse/archive/2006/01/14/2733.html#Feedback12http://www.shnenglu.com/converse/comments/commentRss/2733.htmlhttp://www.shnenglu.com/converse/services/trackbacks/2733.html       时常在cpp的代码之中看到这L代码:

#ifdef __cplusplus
extern "C" {
#endif

//一D代?/SPAN>

#ifdef __cplusplus
}

#endif


        q样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示q是一Dcpp的代?也就是说,上面的代码的含义?如果q是一Dcpp的代?那么加入extern "C"{和}处理其中的代?

        要明白ؓ何用extern "C",q得从cpp中对函数的重载处理开始说?在c++?Z支持重蝲机制,在编译生成的汇编码中,要对函数的名字进行一些处?加入比如函数的返回类型等{?而在C?只是单的函数名字而已,不会加入其他的信?也就是说:C++和C对生的函数名字的处理是不一L.

         比如下面的一D늮单的函数,我们看看加入和不加入extern "C"产生的汇~代码都有哪些变?

int f(void)
{
    
return 1;
}


       在加入extern "C"的时候生的汇编代码?

    .file    "test.cxx"
    .text
    .align 
2
.globl _f
    .def    _f;    .scl    
2;    .type    32;    .endef
_f:
    pushl    
%ebp
    movl    
%esp, %ebp
    movl    $
1%eax
    popl    
%ebp
    ret


但是不加入了extern "C"之后

 .file "test.cxx"
 .text
 .align 
2
.globl __Z1fv
 .def __Z1fv; .scl 
2; .type 32; .endef
__Z1fv:
 pushl 
%ebp
 movl 
%esp, %ebp
 movl $
1%eax
 popl 
%ebp
 ret


        两段汇编代码同样都是使用gcc -S命o产生?所有的地方都是一L,
唯独是生的函数?一个是_f,一个是__Z1fv.

        OK,明白了加入与不加入extern "C"之后对函数名UC生的影响,我们l箋我们的讨?Z么需要用extern "C"?
        C++之父在设计C++之时,考虑到当时已l存在了大量的C代码,Z支持原来的C代码和已l写好C?需要在C++中尽可能的支持C,而extern "C"是其中的一个策?

       试想q样的情?一个库文g已经用C写好了而且q行得很良好,q个时候我们需要用这个库文g,但是我们需要用C++来写q个新的代码.如果q个代码使用的是C++的方式链接这个C库文件的?那么׃出现链接错误.我们来看一D代?首先,我们使用C的处理方式来写一个函?也就是说假设q个函数当时是用C写成?

//f1.c
extern "C"
{
void f1()
{
    
return;
}

}

~译命o?gcc -c f1.c -o f1.o   产生了一个叫f1.o的库文g.
再写一D代码调用这个f1函数:

// test.cxx
//q个extern表示f1函数在别的地方定?q样可以通过
//~译,但是链接的时候还是需?BR>//链接上原来的库文?
extern void f1();

int main()
{
    f1();

    
return 0;
}


通过gcc -c  test.cxx -o test.o 产生一个叫test.o的文?
然后,我们使用gcc test.o f1.o来链接两个文?可是出错?错误的提C是:
test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'
也就是说,在编译test.cxx的时候编译器是用C++的方式来处理f1()函数?但是实际上链接的库文件却是用C的方式来处理函数?所以就会出现链接过不去的错?因ؓ链接器找不到函数.
      因此,Z在C++代码中调用用C写成的库文g,需要用extern "C"来告诉编译器:q是一个用C写成的库文g,LC的方式来链接它们.
      比如,现在我们有了一个C库文?它的头文件是f.h,产生的lib文g是f.lib,那么我们如果要在C++中用这个库文g,我们需要这样写:

extern "C"
{
#include 
"f.h"
}

回到上面的问?如果要改正链接错?我们需要这样子改写test.cxx:

extern "C"
{
extern void f1();
}


int main()
{
    f1();

    
return 0;
}


重新~译q且链接可以过M.

ȝ:C和C++对函数的处理方式是不同的.extern "C"是C++能够调用C写作的库文g的一个手D?如果要对~译器提CZ用C的方式来处理函数的话,那么p使用extern "C"来说?

 

 

 



那谁 2006-01-14 23:52 发表评论
]]>
ƷþþþaӰԺ| žžþȻ㽶ͼƬ| 99þþþƷ| AVҰ¾þ| þĻר| þþþƷ| ˾Ʒþһav| þ99ۺϾƷŮͬ| ˾þۺ| ɫۺϾþ| þǿdŮ| þ| Ʒþþ㽶| Ʒþˬ| ƷþþþþþþӰԺ| þˬ˰| þþþAVƬ | þþþAVרɫ| ˶ݺɫۺϾþ| ˾þƵ| Ʒþþþþþþþ | 91Ʒ91þþþþ| 99Ʒþþþþþó| þþƷư| ݺۺϾþۺ88| ɫۺϾþҹɫƷ| ҹþþӰԺ| þþƷһ| 91ƷѾþþþþþþ| Ʒþþþþ˳| 뾫ƷþɪӰ| þþƷ99Ʒ | AŮAVۺϾþþ| Ļɫ͵͵þ| 99þ˾ƷۺϹۿ| պƷþþþþþõӰ| Aݺݾþɫ| ŷ˾þþƷ| 97þù޾Ʒ| þþžžþƷֱ| þþþ뾫Ʒ|