??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲精品无码观看不卡,久久se精品一区二区影院,97久久综合精品久久久综合http://www.shnenglu.com/ioriiod0/zh-cnTue, 06 May 2025 23:06:08 GMTTue, 06 May 2025 23:06:08 GMT60C++ 协程与网l编E?/title><link>http://www.shnenglu.com/ioriiod0/archive/2013/01/01/196890.html</link><dc:creator>江浸?/dc:creator><author>江浸?/author><pubDate>Tue, 01 Jan 2013 05:14:00 GMT</pubDate><guid>http://www.shnenglu.com/ioriiod0/archive/2013/01/01/196890.html</guid><wfw:comment>http://www.shnenglu.com/ioriiod0/comments/196890.html</wfw:comment><comments>http://www.shnenglu.com/ioriiod0/archive/2013/01/01/196890.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/ioriiod0/comments/commentRss/196890.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ioriiod0/services/trackbacks/196890.html</trackback:ping><description><![CDATA[<h3>协程</h3><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">协程Q即协作式程序,其思想是,一pd互相依赖的协E间依次使用CPUQ每ơ只有一个协E工作,而其他协E处于休眠状态。协E可以在q行期间的某个点上暂停执行,q在恢复q行时从暂停的点上l执行?协程已经被证明是一U非常有用的E序lgQ不仅被python、lua、ruby{脚本语aq泛采用Q而且被新一代面向多核的~程语言如golang rust-lang{采用作为ƈ发的基本单位?协程可以被认为是一U用L间线E,与传l的U程相比Q有2个主要的优点Q?/p><ul style="padding: 0px; margin: 0px 0px 10px 20px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; line-height: normal; background-color: #ffffff;"><li style="padding: 0px; margin: 0px;">与线E不同,协程是自׃动让出CPUQƈ交付他期望的下一个协E运行,而不是在M时候都有可能被pȝ调度打断。因此协E的使用更加清晰易懂Qƈ且多数情况下不需要锁机制?/li><li style="padding: 0px; margin: 0px;">与线E相比,协程的切换由E序控制Q发生在用户I间而非内核I间Q因此切换的代h非常?/li></ul><h3>|络~程模型</h3><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">首先来简单回一下一些常用的|络~程模型。网l编E模型可以大体的分ؓ同步模型和异步模型两cR?/p><ul style="padding: 0px; margin: 0px 0px 10px 20px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; line-height: normal; background-color: #ffffff;"><li style="padding: 0px; margin: 0px;">同步模型Q?/li></ul><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">同步模型使用dIO模式,在阻塞IO模式下调用read{IO函数时会dU程直到IO完成或失败?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">同步模型的典型代表是thread per connection模型Q每当阻塞在ȝE上的accept调用q回时则创徏一个新的线E去服务于新的socket的读/写。这U模型的优点是程序简z,~写单;~点是可伸羃性收到线E数的限Ӟ当连接越来越多时Q线E也来多Q频J的U程切换会严重拖累性能?/p><ul style="padding: 0px; margin: 0px 0px 10px 20px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; line-height: normal; background-color: #ffffff;"><li style="padding: 0px; margin: 0px;">异步模型Q?/li></ul><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">异步模型一般用非dIO模式Qƈ配合epoll/select/poll{多路复用机制。在非阻塞模式下调用readQ如果没有数据可d立即q回q知用户没有可读QEAGAIN/EWOULDBLOCKQ,而非d当前U程。异步模型可以一个线E同时服务于多个IO对象?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">异步模型的典型代表是reactor模型。在reactor模型中,我们所有要处理的IO事g注册C个中心的IO多\复用器中Q一般ؓepoll/select/pollQ,同时ȝE阻塞在多\复用器上。一旦有IO事g到来或者就l,多\复用器返回ƈ对应的IO事g分发到对应的处理器(卛_调函敎ͼ中,最后处理器调用read/write函数来进行IO操作?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">异步模型的特Ҏ性能和可伸羃性比同步模型要好很多Q但是其l构复杂Q不易于~写和维护。在异步模型中,IO之前的代码(IOd的提交者)和IO之后的处理代码(回调函数Q是割裂开来的?/p><h3>协程与网l编E?/h3><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">协程为克服同步模型和异步模型的缺点,q结合他们的优点提供了可能: 现在假设我们?个协EA,B,C分别要进行数ơIO操作。这3个协E运行在同一个调度器或者说U程的上下文中,q依ơ用CPU。调度器在其内部l护了一个多路复用器Qepoll/select/pollQ?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">协程A首先q行Q当它执行到一个IO操作Q但该IO操作q没有立卛_l时QA该IO事g注册到调度器中,q主动放弃CPU。这时调度器B切换到CPU上开始执行,同样Q当它碰C个IO操作的时候将IO事g注册到调度器中,q主动放弃CPU。调度器C切换到cpu上开始执行。当所有协E都?#8220;d”后,调度器检查注册的IO事g是否发生或就l。假设此时协EB注册的IO旉已经qAQ调度器恢复B的执行,B从上次攑ּCPU的地Ҏ着向下q行。A和C同理?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">q样Q对于每一个协E来_是同步的模型Q但是对于整个应用程序来_却是异步的模型?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">好了Q原理说完了Q我们来看一个实际的例子Qecho server?/p><h3>echo server</h3><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">在这个例子中Q我们将使用orchid库来~写一个echo server?a rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">orchid</a>库是一个构Zboost基础上的 协程/|络IO 库?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">echo server首先必须要处理连接事Ӟ我们创徏一个协E来专门处理q接事gQ?/p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">typedef boost::shared_ptr<orchid::socket> socket_ptr; <br />//处理ACCEPT事g的协E?<br />void handle_accept(orchid::coroutine_handle co) {<br /> try { <br />         orchid::acceptor acceptor(co -> get_scheduler().get_io_service());//构徏一个acceptor<br /> acceptor.bind_and_listen("5678",true); <br />         for(;;) { <br />            socket_ptr sock(new orchid::socket(co -> get_scheduler().get_io_service()));<br /> acceptor.accept(*sock,co); <br />            <span style="background-color: transparent; font-family: 'Courier New', Arial; font-size: 9pt;">//在调度器上创Z个协E来服务新的socket?/span><span style="background-color: transparent; font-family: 'Courier New', Arial; font-size: 9pt;">W一个参数是要创建的协程的main函数Q?/span><span style="background-color: transparent; font-family: 'Courier New', Arial; font-size: 9pt;">W二个参数是要创建的协程的栈的大?/span><br />            co -> get_scheduler().spawn(boost::bind(handle_io,_1,sock),orchid::minimum_stack_size());<br /> }<br /> } catch(boost::system::system_error& e) {<br />            cerr<<e.code()<<" "<<e.what()<<endl;<br /> } <br />} </code></pre><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">在orchid中,协程的main函数必须满函数{֐void(orchid::coroutine_handle)Q如handle_accept所C,其中参数co是协E句柄,代表了当前函数所位于的协E?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">在上面的代码中,我们创徏了一个acceptorQƈ让它监听5678端口Q然后在"d"{待q接到来Q当q接事g到来Ӟ创徏一个新的协E来服务新的socket。处理套接字IO的协E如下:</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">//处理SOCKET IO事g的协E?<br />void handle_io(orchid::coroutine_handle co,socket_ptr sock) { <br />   orchid::tcp_ostream out(*sock,co); <br />   orchid::tcp_istream in(*sock,co); <br />   for(std::string str;std::getline(in, str) && out;) {<br />      out<<str<<endl; <br />   } <br />} </code></pre><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">IO处理协程首先在传入的套接字上创徏了一个输入流和一个输出流Q分别代表了TCP的输入和输出。然后不断地从输入流中读取一行,q输出到输出当中。当socket上的TCPq接断开Ӟ输入和输出的eof标志Z被置位,因此循环l束Q协E退出?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">orchid可以使用户以的形式来操作套接字。输入流和输出流分别提供了std::istream和std::ostream的接口;输入和输出是带缓冲的Q如果用户需要无~冲的读写socket或者自建缓Ԍ可以直接调用orchid::socket的read和write函数。但是需要注意这两个函数会抛出boost::system_error异常来表C错误?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">l心的读者可能已l发玎ͼhandle_io的函数签名ƈ不满void(orchid::coroutine_handle)Q回到handle_accept中,可以发现Q实际上我们使用了boost.bind对handle _ io函数q行了适配Q之符合函数签名的要求?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">最后是main函数Q?/p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; background-color: #f6f6f6;"><code style="padding: 0px; margin: 0px; border: none; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">int main() { <br />   orchid::scheduler sche; <br />   sche.spawn(handle_accept,orchid::coroutine::minimum_stack_size());//创徏协程 <br />   sche.run(); <br />} </code></pre><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">在上面这个echo server的例子中Q我们采用了一U?coroutine per connection 的编E模型,与传l的 thread per connection 模型一Lz清晎ͼ但是整个E序实际上运行在同一U程当中?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">׃协程的切换开销q远于U程Q因此我们可以轻易的同时启动上千协程来同时服务上千连接,q是 thread per connection的模型很隑ց到的Q在性能斚wQ整个底层的IOpȝ实际上是使用boost.asioq种高性能的异步io库实现的。而且与IO所费的旉相比Q协E切换的开销基本可以忽略?/p><p style="padding: 0px; margin: 0px 0px 15pt; line-height: 1.5; letter-spacing: 1px; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;">因此通过协程Q我们可以在保持同步IO模型z性的同时Q获得近g异步IO模型的高性能?/p><img src ="http://www.shnenglu.com/ioriiod0/aggbug/196890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ioriiod0/" target="_blank">江浸?/a> 2013-01-01 13:14 <a href="http://www.shnenglu.com/ioriiod0/archive/2013/01/01/196890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为std::tupled格式?序列化支?/title><link>http://www.shnenglu.com/ioriiod0/archive/2011/11/28/161049.html</link><dc:creator>江浸?/dc:creator><author>江浸?/author><pubDate>Sun, 27 Nov 2011 21:17:00 GMT</pubDate><guid>http://www.shnenglu.com/ioriiod0/archive/2011/11/28/161049.html</guid><wfw:comment>http://www.shnenglu.com/ioriiod0/comments/161049.html</wfw:comment><comments>http://www.shnenglu.com/ioriiod0/archive/2011/11/28/161049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ioriiod0/comments/commentRss/161049.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ioriiod0/services/trackbacks/161049.html</trackback:ping><description><![CDATA[<div><h1><span style="line-height: normal; ">转蝲h明出处。谢?/span></h1></div>C++11中有很多Ȁ动h心的Ҏ?但是相应的得C++更加复杂。。?br /><font class="Apple-style-span" face="Simsun" size="3"><span id="4o84yg4" class="Apple-style-span" style="line-height: normal; ">新标准还修改了原有标准库Qƈ增加了很多内宏V?br /><br />在学习新标准的过E中动手写了?为std::tuple增加格式?序列化能力的一段代码<br /><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: #0000FF; ">#define</span><span style="color: #000000; "> DECLARE_TUPLE_SERIALIZATION_FUNCTION(FUNC_NAME,BEG,SEP,END)     \</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; "> sjdfsjfyttsaihfah6755jsdf554433356sdf{                        \<br />template </span><span style="color: #000000; "><</span><span style="color: #000000; ">typename Tuple,std::size_t N</span><span style="color: #000000; ">></span><span style="color: #000000; ">                                 \<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> tuple_printer                                                    \<br />{                                                                       \<br />    </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> print(std::ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> os,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Tuple</span><span style="color: #000000; ">&</span><span style="color: #000000; "> t)                  \<br />    {                                                                   \<br />        os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; "><</span><span style="color: #000000; ">std::tuple_size</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple</span><span style="color: #000000; ">></span><span style="color: #000000; ">::value </span><span style="color: #000000; ">-</span><span style="color: #000000; "> N </span><span style="color: #000000; ">></span><span style="color: #000000; ">(t)</span><span style="color: #000000; "><<</span><span style="color: #000000; ">SEP;       \<br />        tuple_printer</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple,N</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">></span><span style="color: #000000; ">::print(os,t);                          \<br />    }                                                                   \<br />};                                                                      \<br />                                                                        \<br />template </span><span style="color: #000000; "><</span><span style="color: #000000; ">typename Tuple</span><span style="color: #000000; ">></span><span style="color: #000000; ">                                               \<br /></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> tuple_printer</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">></span><span style="color: #000000; ">                                           \<br />{                                                                       \<br />    </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> print(std::ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> os,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Tuple</span><span style="color: #000000; ">&</span><span style="color: #000000; "> t)                  \<br />    {                                                                   \<br />        os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">std::</span><span style="color: #0000FF; ">get</span><span style="color: #000000; "><</span><span style="color: #000000; ">std::tuple_size</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple</span><span style="color: #000000; ">></span><span style="color: #000000; ">::value</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">></span><span style="color: #000000; ">(t);               \<br />    }                                                                   \<br />};                                                                      \<br />}                                                                       \<br />template </span><span style="color: #000000; "><</span><span style="color: #000000; ">typename Tuple</span><span style="color: #000000; ">></span><span style="color: #000000; ">                                               \<br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> FUNC_NAME(std::ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> os,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> Tuple</span><span style="color: #000000; ">&</span><span style="color: #000000; "> t)                         \<br />{                                                                       \<br />    os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">BEG;                                                            \<br />    sjdfsjfyttsaihfah6755jsdf554433356sdf::tuple_printer</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple,std::tuple_size</span><span style="color: #000000; "><</span><span style="color: #000000; ">Tuple</span><span style="color: #000000; ">></span><span style="color: #000000; ">::value</span><span style="color: #000000; ">></span><span style="color: #000000; ">::print(os,t);    \<br />    os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">END;                                                            \<br />}                                                                       <br /></span></div></span></font><font class="Apple-style-span" face="Simsun" size="3"><span id="mmwksme" class="Apple-style-span" style="line-height: normal; ">实现成宏是ؓ了用v来更方便Q可以随意指?函数?前缀 分隔W??后缀?br />使用Ҏ如下Q?br /><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: #000000; ">DECLARE_TUPLE_SERIALIZATION_FUNCTION(serialize_tuple,</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; ">"</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; ">></span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> main()<br />{<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />    auto a </span><span style="color: #000000; ">=</span><span style="color: #000000; "> std::make_tuple(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">lala</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,i,</span><span style="color: #000000; ">'</span><span style="color: #000000; ">c</span><span style="color: #000000; ">'</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br />    serialize_tuple(std::cout,a); <br />}</span></div><br />输出为:<br /><3 , "lala" , 10 , c><br /><br />试环境为GCC 4.5Q注意编译时候请打开C++0X支持?br /><br /><br /></span></font><img src ="http://www.shnenglu.com/ioriiod0/aggbug/161049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ioriiod0/" target="_blank">江浸?/a> 2011-11-28 05:17 <a href="http://www.shnenglu.com/ioriiod0/archive/2011/11/28/161049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做MTKW试的ȝQ二Q-QCQ+ q回g化(RVOQ?/title><link>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153300.html</link><dc:creator>江浸?/dc:creator><author>江浸?/author><pubDate>Sat, 13 Aug 2011 13:38:00 GMT</pubDate><guid>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153300.html</guid><wfw:comment>http://www.shnenglu.com/ioriiod0/comments/153300.html</wfw:comment><comments>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153300.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/ioriiod0/comments/commentRss/153300.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ioriiod0/services/trackbacks/153300.html</trackback:ping><description><![CDATA[<span id="6448a48" class="Apple-style-span" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">题目二:<br />   题目我做了下改变Q用了上篇文章中提到的那个cXQ代码如下:<br /><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; "> 1</span> <span style="color: #0000FF; ">class</span><span style="color: #000000; "> X<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    X(){cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">default construct</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; ">    X(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a):i(a){ cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">construct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">    </span><span style="color: #000000; ">~</span><span style="color: #000000; ">X(){ cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">desconstruct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    X(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x):i(x.i)<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">copy construct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">++</span><span style="color: #000000; ">()<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator ++(pre) </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">        </span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">++</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">18</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">19</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator ++(post) </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">20</span> <span style="color: #000000; ">        X x(</span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">21</span> <span style="color: #000000; ">        </span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br /></span><span style="color: #008080; ">22</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> x;<br /></span><span style="color: #008080; ">23</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">24</span> <span style="color: #000000; ">    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> m)<br /></span><span style="color: #008080; ">25</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">26</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator =(int)</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">27</span> <span style="color: #000000; ">        i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> m;<br /></span><span style="color: #008080; ">28</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">29</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">30</span> <span style="color: #000000; ">    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x)<br /></span><span style="color: #008080; ">31</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">32</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator =(X)</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">33</span> <span style="color: #000000; ">        i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">x.i;<br /></span><span style="color: #008080; ">34</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">35</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">36</span> <span style="color: #000000; ">    </span><span style="color: #808080; ">////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">37</span> <span style="color: #808080; "></span><span style="color: #000000; ">    friend ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; "><<</span><span style="color: #000000; ">(ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> os,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x)<br /></span><span style="color: #008080; ">38</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">39</span> <span style="color: #000000; ">        os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">x.i;<br /></span><span style="color: #008080; ">40</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> os;<br /></span><span style="color: #008080; ">41</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">42</span> <span style="color: #000000; ">    friend X </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> a,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> b)<br /></span><span style="color: #008080; ">43</span> <span style="color: #000000; ">    {<br /></span><span style="color: #008080; ">44</span> <span style="color: #000000; ">        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator +</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #008080; ">45</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> X(a.i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">b.i);<br /></span><span style="color: #008080; ">46</span> <span style="color: #000000; ">    }<br /></span><span style="color: #008080; ">47</span> <span style="color: #000000; ">    </span><span style="color: #808080; ">////////////////////////</span><span style="color: #008000; ">//</span><span style="color: #808080; "><br /></span><span style="color: #008080; ">48</span> <span style="color: #808080; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">49</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i;<br /></span><span style="color: #008080; ">50</span> <span style="color: #000000; ">};</span></div><br /></span>请问以下代码的输出是什么?<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; ">1</span> <span style="color: #000000; ">X a(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">),b(</span><span style="color: #000000; ">20</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">2</span> <span style="color: #000000; ">X c</span><span style="color: #000000; ">=</span><span style="color: #000000; ">a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">b;</span></div><br />我们来看一下用GCC4.5Q默认编译选项Q以及MSVC9.0(BOTH DEBUG AND RELEASE)~译后的实际q行l果Q?br /><div><div>construct 10</div><div>construct 20</div><div>operator +</div><div>construct 30</div><div>desconstruct 30</div><div>desconstruct 20</div><div>desconstruct 10<br /><br />单分析下q个输出Q?br /><br /><div><div>construct 10 </div><div>construct 20 //对应 X a(10),b(20);</div><div>operator +  //调用“+”操作W?/div><div>construct 30 //调用X(int){...}Q?4行处</div><div>desconstruct 30 //变量c 的析?/div><div>desconstruct 20 //变量b 的析?/div><div>desconstruct 10 //变量a 的析?/div></div> 从结果可以看出,整个执行q程中没有输?#8220;operator=”Q说明压Ҏ有调?#8220;Q?#8221;操作W,而且整个q程比我惌的要z高效,没有临时对象Q没有拷贝构造?br />l果Z么会是这样呢Q这主要归功于编译器的返回g化的能力?br />有关q回g化的知识Q限于篇q我׃仔细介绍了,但是需要特别指出的是MSVC9.0只在RELEASE模式下默认开启NRVOQ即对具名对象的q回g化,以及q回g化里面的一个重要的l节Q体现在本例里就是:Z么中整个输出中没有出?opeartor=",即ؓ什么没调用"="操作W?br /><br />现在我们代码稍微改变一下,Ҏ下面的样?<br /><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: #000000; ">X a(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">),b(</span><span style="color: #000000; ">20</span><span style="color: #000000; ">),c;<br />c</span><span style="color: #000000; ">=</span><span style="color: #000000; ">a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">b;  Q/q里我们c的构造和赋值分开?/span></div><br />执行的结果如下:<br /><br /><div><div>construct 10 Q/构造a</div><div>construct 20 Q/构造b</div><div>default construct Q/构?c</div><div>operator +  Q/调用“+”操作W?/div><div>construct 30 Q/调用X(int){...}Q?4行处</div><div>operator =(X) Q/调用“Q?#8221;操作W?/div><div>desconstruct 30 Q/代码45行所建立的时对象的析构</div><div>desconstruct 30 Q/变量c的析?/div><div>desconstruct 20 Q/变量b的析?/div><div>desconstruct 10 Q/变量c的析?br /><br />Ҏ前后的输出结果,可以发现多出以下三行</div></div><div><div>default construct </div></div><div>operator =(X) </div><div>desconstruct 30 <br />出现q种差异的原因在于:<div style="display: inline-block; "></div><span id="kwsa8qi" class="Apple-style-span" style="color: #333333; font-family: Arial; background-color: #ffffff; ">定义c的时候会调用默认的构造函数进行初始化Q因此第一条语句执行完之后Qc已经是一个存在的对象Q所以第二条语句q没有权利去直接修改c的内容,必须要通过调用赋值操作符”=“Q因此必要产生一个时对象。而在W一个例子中Q因为执行到W二条语句之前cq没有被创徏,所以编译器可以?表达式a+b的返回值直接构建在c的内存中Q从而优化掉临时对象和对“Q?#8221;的调用?br /></span></div></div></div><div></div><img src ="http://www.shnenglu.com/ioriiod0/aggbug/153300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ioriiod0/" target="_blank">江浸?/a> 2011-08-13 21:38 <a href="http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做MTKW试的ȝQ一Q?/title><link>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153284.html</link><dc:creator>江浸?/dc:creator><author>江浸?/author><pubDate>Sat, 13 Aug 2011 09:30:00 GMT</pubDate><guid>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153284.html</guid><wfw:comment>http://www.shnenglu.com/ioriiod0/comments/153284.html</wfw:comment><comments>http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153284.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.shnenglu.com/ioriiod0/comments/commentRss/153284.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ioriiod0/services/trackbacks/153284.html</trackback:ping><description><![CDATA[今年要开始找工作了,本着U篏l验的目的,跑去做了下MTK的笔试题Q笔试的内容主要是CQ+?br />因ؓ开发中一直用CQ+Q而且对CQ+里的高Ҏ:面向对象Q模板等都比较熟悉,q没事喜Ƣ研I下STLQBOOSTQ所以对自己的CQ+水^比较自信Q因此事先也没做M准备Q就直接ȝ试了。本来笔试完了后觉得题目蛮简单的Q但是本着认真学习的态度回来后把题目都上验了下,l果一下就悲剧了,错的体无完服啊。。?br />ȝ了一下:<br />   1。认真对待,不要看了笔试题目:做题的时候心惌些笔试题目都很简单啊Q很多题目都是扫了一眼就立即写出了答案,l果回来后才发现q些题目都设|了陷阱Q让你掉q去出不来了?br />   2。CQ+基础不够扎实。枉我还一天到晚的研究CQ+的高U特性,l果很多基础的知识却都是一知半解?br />特将此次W试的一些心得和体会记录于此Q好提醒自己。下面主要分析几个我做错的题目。题目ƈ非与原题完全一致?br />题目一Q?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: #0000FF; ">int</span><span style="color: #000000; "> a</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,b</span><span style="color: #000000; ">=</span><span style="color: #000000; ">6</span><span style="color: #000000; ">;<br />cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">b</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; "><<</span><span style="color: #000000; ">a</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; "><<</span><span style="color: #000000; ">b</span><span style="color: #000000; ">++</span><span style="color: #000000; ">; </span></div><br />误Zq语句的执行l果?br />很多人看q这D代码后估计都会直接写上了 16 10 6 q样的结果吧Q但上机实验的输出结果是Q?18 10 6<br />Z么会出现q样的结果,下面是我的分析过E,如果有不对的地方请大家指正?br />Z跟踪代码的执行步骤,我设计了一个类XQ这个类是对int的模拟,行ؓ斚w与int基本一_除了会打印出一些帮助我们理解的信息Q代码如下:<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: #0000FF; ">class</span><span style="color: #000000; "> X<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />    X(){cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">default construct</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br />    X(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> a):i(a){ cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">construct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br />    </span><span style="color: #000000; ">~</span><span style="color: #000000; ">X(){ cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">desconstruct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;}<br />    X(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x):i(x.i)<br />    {<br />        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">copy construct </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br />    }<br />    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</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; ">operator ++(pre) </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br />        </span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br />    }<br />    </span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">++</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)<br />    {<br />        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator ++(post) </span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">i</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br />        X x(</span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br />        </span><span style="color: #000000; ">++</span><span style="color: #000000; ">i;<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> x;<br />    }<br />    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> m)<br />    {<br />        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator =(int)</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br />        i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> m;<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br />    }<br />    X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x)<br />    {<br />        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator =(X)</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br />        i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">x.i;<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> </span><span style="color: #000000; ">*</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br />    }<br />    </span><span style="color: #808080; ">////////////////////////</span><span style="color: #008000; ">/</span><span style="color: #808080; "><br /></span><span style="color: #000000; ">    friend ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; "><<</span><span style="color: #000000; ">(ostream</span><span style="color: #000000; ">&</span><span style="color: #000000; "> os,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> x)<br />    {<br />        os</span><span style="color: #000000; "><<</span><span style="color: #000000; ">x.i;<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> os;<br />    }<br />    friend X </span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> a,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "> X</span><span style="color: #000000; ">&</span><span style="color: #000000; "> b)<br />    {<br />        cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">operator +</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">endl;<br /></span><span style="color: #0000ff; ">        return</span><span style="color: #000000; "> X(a.i+b.i);</span><span style="color: #000000; "><br />    }<br />    </span><span style="color: #808080; ">////////////////////////</span><span style="color: #008000; ">//</span><span style="color: #808080; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i;<br />};</span></div><br />然后执行以下代码Q?br /><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: #000000; ">    X a(</span><span style="color: #000000; ">10</span><span style="color: #000000; ">),b(</span><span style="color: #000000; ">6</span><span style="color: #000000; ">);<br />    cout</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sum:</span><span style="color: #000000; ">"</span><span style="color: #000000; "> </span><span style="color: #000000; "><<</span><span style="color: #000000; ">a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">b</span><span style="color: #000000; "><<</span><span style="color: #000000; ">"</span><span style="color: #000000; "> a:</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">a</span><span style="color: #000000; ">++<<</span><span style="color: #000000; ">"</span><span style="color: #000000; "> b:</span><span style="color: #000000; ">"</span><span style="color: #000000; "><<</span><span style="color: #000000; ">b</span><span style="color: #000000; ">++<<</span><span style="color: #000000; ">endl;<br /></span></div><br />使用GCC4?~译后,代码的执行结果如下:<br /><br /><div><div><div><div>construct 10</div><div>construct 6</div><div>operator ++(post) 6</div><div>copy construct 6</div><div>operator ++(post) 10</div><div>copy construct 10</div><div>operator +</div><div>construct 18</div><div>sum:18 a:10 b:6</div><div>desconstruct 18</div><div>desconstruct 10</div><div>desconstruct 6</div><div>desconstruct 7</div><div>desconstruct 11</div></div><div></div></div></div><div>我们来简单分析下q个执行q程Q?/div><br /><div><div>construct 10</div><div>construct 6  Q/q两行输出对应于 X a(10),b(6); <br /><br /><div><div>operator ++(post) 6</div><div>copy construct 6 Q/表明首先执行?nbsp; cout<<"sum:" <<a+b<<" a:"<<a++<<" b:"<<b++<<endl;q句中的 b++q个表达式,<br />                              b++q个表达式返回了一个gؓ6的时对象,而b本n则变成了7?br /><div style="display: inline-block; "><div><div><div></div><div>operator ++(post) 10 <br />copy construct 10  Q/q句的分析同?br /><br /><div><div>operator +</div><div>construct 18 //对应于表辑ּ a+b ,可以看到Q此时的a和b已经变成?1?。表辑ּq回了一个gؓ18的时对象?br /><br /><div>sum:18 a:10 b:6 Q/输出的结果,从结果可以看出,实际上打印出的值分别ؓ a+b,a++和bQ+三个表达式所q回的时变量?/div></div></div></div></div></div></div></div></div><span id="yu84m4w" class="Apple-style-span" style="background-color: #eeeeee; "><span style="color: #000000; "><br /></span></span></div></div><div>desconstruct 18 Q/aQb 表达式返回的临时变量的析?/div><div>desconstruct 10 Q/aQ+ 表达式返回的临时变量的析?/div><div>desconstruct 6 Q/bQ+表达式返回的临时变量的析?/div><div>desconstruct 7 Q/变量a 的析?/div><div>desconstruct 11  Q/变量b的析?br /><br />真相大白了。ؓ什么编译器会这h~译q个表达式呢Q?br />下面2楼的夜风同学l出了正答案。。ؓ了不误导后面的同学,Ҏ~辑掉。?br /><br />上述实验的环境均为GCC4?  据同学说VS2010执行的结果在DEBUG下和RELEASE下居然分别ؓQ?6 10 6 ?8 10 6Q不q我没有去验证过Q有兴趣的同学可以去验证q分析一下?br />做这样一道题q是让我收获很多QmZCQ+的基?br />今天写道这里,后面有时间会陆箋攑և对其?#8220;陷阱”题目的分析?br />Q未完待l)</div><font class="Apple-style-span" color="#008080" size="2"><br /></font><img src ="http://www.shnenglu.com/ioriiod0/aggbug/153284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ioriiod0/" target="_blank">江浸?/a> 2011-08-13 17:30 <a href="http://www.shnenglu.com/ioriiod0/archive/2011/08/13/153284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对BOOST 中同步互斥的一些理?/title><link>http://www.shnenglu.com/ioriiod0/archive/2011/05/26/147135.html</link><dc:creator>江浸?/dc:creator><author>江浸?/author><pubDate>Wed, 25 May 2011 17:10:00 GMT</pubDate><guid>http://www.shnenglu.com/ioriiod0/archive/2011/05/26/147135.html</guid><wfw:comment>http://www.shnenglu.com/ioriiod0/comments/147135.html</wfw:comment><comments>http://www.shnenglu.com/ioriiod0/archive/2011/05/26/147135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ioriiod0/comments/commentRss/147135.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ioriiod0/services/trackbacks/147135.html</trackback:ping><description><![CDATA[首先QBOOST中有4U有关互斥量得概c?br />1.LOCKABLE :仅支持排它型所有权<br />2.TIMEDLOCKABLEQ支持带时的排它型所有权<br />3.SHAREDLOCKABLEQ?支持带超时的排他型所有权和共享型所有权Q读写锁Q?br />4.UPGRADELOCKABLEQ?nbsp;<div style="display: inline-block; "></div>支持带超时的排他型所有权和共享型所有权Q以及共享型所有权升为排他型所有权Q升U过E阻塞)(也支持降U?<br /><br />可以看到2强化?,3强化?.4强化?Q支持某一概念则一定支持其强化自的概念?br /><br />boost::mutex 实现了LOCKABLE概念 Qboost::recursive_mutex 是其递归锁的版本Q?br />boost::timed_mutex 实现了TIMEDLOCKABLE概念 <div style="display: inline-block; "></div>Qboost::recursive_timed_mutex 是其递归锁的版本Q?br />boost::shared_mutex实现了SHAREDLOCKABLE概念<br />boost::shared_mutex同样实现了UPGRADELOCKABLE概念<br /><br />Z提供RAII操作风格和安全等其他一些原因BOOST不希望用L接调用各UMUTEXcd中的相关接口Q而是通过它提供的一些LOCK_TYPE来帮助我们调用?br /><br />主要的LOCK_TYPE包括Q?br /><br />boost::unique_lock<LOCKABLE> 针对支持LOCKABLE概念的类型(上述4中MUTEXcd都支持LOCKABLE概念Q。以RAII的方式调用该cȝlock() <div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: inline-block; "></div>Q调用成功后排它的独占该互斥量)?unlock() Ҏ?br /><br />boost::shared_lock<SHAREDLOCKABLE>针对支持SHAREDLOCKABLE概念的类型,boost::shared_mutex实现了该概念Q注意,支持SHAREDLOCKABLE概念的类既支持排他的独占Q写锁,通过调用lock unlockpd函数Q,也支持共享的方式占用Q读锁,通过调用lock_sharedpdQ,<div style="display: inline-block; "></div>shared_lock默认调用<div style="display: inline-block; "></div>lock_sharedpd?br /><br />最主要最常用的就是上面这两个LOCKcdQ分别代表独占方式和׃n方式Q其他的׃一一分析了?br /><br />下面是个?a >http://hi.baidu.com/jrckkyy/blog/item/d7ccb508dfba2e3ce8248817.html</a>此处扑ֈ的例?br /><br /><div><span id="wmgcssk" class="Apple-style-span" style="color: #333333; font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">typedef <span id="ukei4ii" class="hilite1" style="line-height: normal; ">boost</span>::shared_mutex rwmutex; <br style="line-height: normal; " />typedef <span id="ksuoq88" class="hilite1" style="line-height: normal; ">boost</span>::shared_lock<rwmutex> readLock; <br style="line-height: normal; " />typedef <span id="aike8ow" class="hilite1" style="line-height: normal; ">boost</span>::uniq_lock<rwmutex> writeLock; <br style="line-height: normal; " /><br style="line-height: normal; " />rwmutex  _rwmutex; <br style="line-height: normal; " /><br style="line-height: normal; " />void readOnly() <br style="line-height: normal; " />{ <br style="line-height: normal; " />... <br style="line-height: normal; " />{ // 临界?nbsp;<br style="line-height: normal; " />readLock rdlock<div style="display: inline-block; "></div></span><span id="ue8ok4o" class="Apple-style-span" style="color: #333333; font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">(_rwmutex)</span><span id="qoqk8kk" class="Apple-style-span" style="color: #333333; font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">; <br style="line-height: normal; " />... <br style="line-height: normal; " />do something <br style="line-height: normal; " />... <br style="line-height: normal; " />} <br style="line-height: normal; " />... <br style="line-height: normal; " />} <br style="line-height: normal; " /><br style="line-height: normal; " />void writeOnly() <br style="line-height: normal; " />{ <br style="line-height: normal; " />... <br style="line-height: normal; " />{ // 临界?nbsp;<br style="line-height: normal; " />writeLock wlock(<div style="display: inline-block; "></div></span><span id="444yc8y" class="Apple-style-span" style="color: #333333; font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">_rwmutex</span><span id="s4gm888" class="Apple-style-span" style="color: #333333; font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">); <br style="line-height: normal; " />... <br style="line-height: normal; " />do something <br style="line-height: normal; " />... <br style="line-height: normal; " />} <br style="line-height: normal; " />... <br style="line-height: normal; " />} <br style="line-height: normal; " /></span></div><br /><br /><br /><br /><br /><br /><img src ="http://www.shnenglu.com/ioriiod0/aggbug/147135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ioriiod0/" target="_blank">江浸?/a> 2011-05-26 01:10 <a href="http://www.shnenglu.com/ioriiod0/archive/2011/05/26/147135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.bihuresorthotel.cn" target="_blank">þþƷŷպ</a>| <a href="http://www.qianhongg.cn" target="_blank">޾Ʒ׽þþþþ </a>| <a href="http://www.matchweb.cn" target="_blank">ĻƷѾþ5151</a>| <a href="http://www.gvyf.cn" target="_blank">þþƷư</a>| <a href="http://www.chaohu8.cn" target="_blank">þþþ99ƷƬ</a>| <a href="http://www.6ccccc.cn" target="_blank">þɫۺҹž</a>| <a href="http://www.51lol.cn" target="_blank">91þþƷ91þɫ</a>| <a href="http://www.wow-diamond.com.cn" target="_blank">þþƷ޸</a>| <a href="http://www.voxj.cn" target="_blank">þþƷAV鶹</a>| <a href="http://www.xysrsks.cn" target="_blank">鶹wwwþ</a>| <a href="http://www.78cbg.cn" target="_blank">޾Ʒþþþȥq</a>| <a href="http://www.zjslzy.com.cn" target="_blank">þ99Ʒþ99ý</a>| <a href="http://www.yicheng688.cn" target="_blank">þþþùɫAVѹۿ</a>| <a href="http://www.tongshi8.cn" target="_blank">ɫ͵͵͵þ˴ý</a>| <a href="http://www.ks-design.cn" target="_blank">þseֻоƷ</a>| <a href="http://www.shgdb.cn" target="_blank">þˬˬAV</a>| <a href="http://www.mbjywz.cn" target="_blank">þþƷۺһ</a>| <a href="http://www.touzhi8.cn" target="_blank">ƷŮ߳׾þþ</a>| <a href="http://www.9n7.com.cn" target="_blank">ܻƺ۵վþmimiɫ</a>| <a href="http://www.yidasoft.com.cn" target="_blank">㽶þۺӰ</a>| <a href="http://www.xishuixian.com.cn" target="_blank">þþþ18</a>| <a href="http://www.ldg8.cn" target="_blank">ھƷþþþþþcoent </a>| <a href="http://www.dnf-video.cn" target="_blank">þùƷһ</a>| <a href="http://www.yoyopj.cn" target="_blank">91Ʒþþþþ</a>| <a href="http://www.sifaguojinb.cn" target="_blank">þݺҹҹ2020һ</a>| <a href="http://www.areall.cn" target="_blank">þþƷ?Ļ</a>| <a href="http://www.uucity.com.cn" target="_blank">ƷþĻ</a>| <a href="http://www.zhunsan.cn" target="_blank">99þþƷѿһ</a>| <a href="http://www.189oa.cn" target="_blank">þþƷ</a>| <a href="http://www.epfb.cn" target="_blank">þþž޾Ʒ</a>| <a href="http://www.wiak.cn" target="_blank">ԭۺϾþ</a>| <a href="http://www.mortels.cn" target="_blank">þѾƷһ</a>| <a href="http://www.hankale.cn" target="_blank">ڵþ</a>| <a href="http://www.baoshuidaili.com.cn" target="_blank">þþƷѿ޹AV</a>| <a href="http://www.misuca.cn" target="_blank">þþƷAV鶹վ</a>| <a href="http://www.mdwmp.com.cn" target="_blank">AVþ</a>| <a href="http://www.odostudio.cn" target="_blank">ҰĻþ</a>| <a href="http://www.ter2.cn" target="_blank">鶹wwwþ</a>| <a href="http://www.bbs020.cn" target="_blank">þֹƷۺ</a>| <a href="http://www.jiawengc.cn" target="_blank">þþþþྫƷֱ</a>| <a href="http://www.a13859701381.cn" target="_blank">ھƷŷþþƷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>