﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Enki</title><link>http://www.cppblog.com/luhputu/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:06:47 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:06:47 GMT</pubDate><ttl>60</ttl><item><title>The Filterator from Ahmed Charles</title><link>http://www.cppblog.com/luhputu/archive/2011/03/23/142590.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Wed, 23 Mar 2011 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/23/142590.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142590.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/23/142590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142590.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142590.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: My name is Ahmed Charles and I currently work on Windows Error Reporting. I believe that this is the first time that someone not on the VC team has written a blog, but I hope you will find it useful a...&nbsp;&nbsp;<a href='http://www.cppblog.com/luhputu/archive/2011/03/23/142590.html'>阅读全文</a><img src ="http://www.cppblog.com/luhputu/aggbug/142590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-23 17:12 <a href="http://www.cppblog.com/luhputu/archive/2011/03/23/142590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lambdas, auto, and static_assert: C++0x Features in VC10 from Stephan T. Lavavej</title><link>http://www.cppblog.com/luhputu/archive/2011/03/23/142589.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Wed, 23 Mar 2011 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/23/142589.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142589.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/23/142589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142589.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142589.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: The Visual C++ compiler in the Microsoft Visual Studio 2010 September Community Technology Preview (CTP) contains support for four C++0x language features, namely lambdas, auto, static_assert, and rva...&nbsp;&nbsp;<a href='http://www.cppblog.com/luhputu/archive/2011/03/23/142589.html'>阅读全文</a><img src ="http://www.cppblog.com/luhputu/aggbug/142589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-23 17:10 <a href="http://www.cppblog.com/luhputu/archive/2011/03/23/142589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Expressive C++: Why Template Errors Suck and What You Can Do About It</title><link>http://www.cppblog.com/luhputu/archive/2011/03/22/142500.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Tue, 22 Mar 2011 10:17:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/22/142500.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142500.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/22/142500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142500.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142500.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: This entry is part of a series, Expressive C++&#187; Entries in this series:    Expressive C++: Introduction    Expressive C++: Playing with Syntax    Expressive C++: Why Template Errors Suck ...&nbsp;&nbsp;<a href='http://www.cppblog.com/luhputu/archive/2011/03/22/142500.html'>阅读全文</a><img src ="http://www.cppblog.com/luhputu/aggbug/142500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-22 18:17 <a href="http://www.cppblog.com/luhputu/archive/2011/03/22/142500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nested lambda's and 'this' pointers</title><link>http://www.cppblog.com/luhputu/archive/2011/03/22/142498.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Tue, 22 Mar 2011 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/22/142498.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142498.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/22/142498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142498.html</trackback:ping><description><![CDATA[<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;type meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;algorithm&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;iostream&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;ostream&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;vector&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">using namespace std;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">class Foo {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">public:<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; explicit Foo(const int x) : m_x(x) { }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; void mult(vector&lt;vector&lt;int&gt;&gt;&amp; outer) const {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for_each(outer.begin(), outer.end(), [&amp;](vector&lt;int&gt;&amp; inner) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for_each(inner.begin(), inner.end(), [&amp;](int&amp; elem) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elem *= m_x;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">private:<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; int m_x;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">};<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">int main() {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; Foo f(1000);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; vector&lt;vector&lt;int&gt;&gt; v(3, vector&lt;int&gt;(4));<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; ++i) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 4; ++j) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v[i][j] = i * 10 + j;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; f.mult(v);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; ++i) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 4; ++j) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; v[i][j] &lt;&lt; " ";<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">}<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 17.00.40309 for 80x86<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">usage: cl [ option... ] filename... [ /link linkoption... ]<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp(14) : error C3494: 'this' cannot be captured in a nested lambda<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp(14) : error C2065: 'm_x' : undeclared identifier<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp(14) : error C2065: 'm_x' : undeclared identifier<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;g++ -Wall -Wextra -std=c++0x meow.cpp -o meow.exe<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">0 1000 2000 3000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">10000 11000 12000 13000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">20000 21000 22000 23000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt">There's a workaround:<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;type meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;algorithm&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;iostream&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;ostream&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;vector&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">using namespace std;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">class Foo {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">public:<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; explicit Foo(const int x) : m_x(x) { }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; void mult(vector&lt;vector&lt;int&gt;&gt;&amp; outer) const {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="BACKGROUND: lime; mso-highlight: lime">const Foo * const myself = this;</span><o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for_each(outer.begin(), outer.end(), [&amp;](vector&lt;int&gt;&amp; inner) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for_each(inner.begin(), inner.end(), [&amp;](int&amp; elem) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elem *= <span style="BACKGROUND: lime; mso-highlight: lime">myself-</span>&gt;m_x;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">private:<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; int m_x;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">};<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">int main() {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; Foo f(1000);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; vector&lt;vector&lt;int&gt;&gt; v(3, vector&lt;int&gt;(4));<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; ++i) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 4; ++j) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v[i][j] = i * 10 + j;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; f.mult(v);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; ++i) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; 4; ++j) {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; v[i][j] &lt;&lt; " ";<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">}<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">0 1000 2000 3000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">10000 11000 12000 13000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">20000 21000 22000 23000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;g++ -Wall -Wextra -std=c++0x meow.cpp -o meow.exe<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">0 1000 2000 3000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">10000 11000 12000 13000<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">20000 21000 22000 23000<o:p></o:p></span></p>
<img src ="http://www.cppblog.com/luhputu/aggbug/142498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-22 18:06 <a href="http://www.cppblog.com/luhputu/archive/2011/03/22/142498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>unexpected value from is_base_of</title><link>http://www.cppblog.com/luhputu/archive/2011/03/22/142496.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Tue, 22 Mar 2011 09:57:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/22/142496.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142496.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/22/142496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142496.html</trackback:ping><description><![CDATA[<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;type meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;type_traits&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">template &lt;typename T&gt; struct A {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; A() {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static_assert(std::is_base_of&lt;A&lt;T&gt;, T&gt;::value, "assert1");<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef typename std::remove_reference&lt;decltype(*this)&gt;::type meow_t;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;static_assert(std::is_base_of&lt;meow_t, T&gt;::value, "assert2");<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">};<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">struct C : public A&lt;C&gt; { };<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">void foo() {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; C c;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">}<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 17.00.40316 for 80x86<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">usage: cl [ option... ] filename... [ /link linkoption... ]<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 /c meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">*this</span><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"> is an lvalue so </span><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">decltype(*this)</span><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"> is indeed </span><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">A&lt;T&gt;&amp;</span><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt">.<o:p></o:p></span></p>
<img src ="http://www.cppblog.com/luhputu/aggbug/142496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-22 17:57 <a href="http://www.cppblog.com/luhputu/archive/2011/03/22/142496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对volatile认识</title><link>http://www.cppblog.com/luhputu/archive/2011/03/22/142495.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Tue, 22 Mar 2011 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/22/142495.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142495.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/22/142495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142495.html</trackback:ping><description><![CDATA[&nbsp;
<p>from MSDN: </p>
<p>The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something other than statements, such as the operating system, the hardware, or a concurrently executing thread. </p>
<p>The following example declares a volatile integer nVint whose value can be modified by external processes: </p>
<p>int volatile nVint; </p>
<p>Objects declared as volatile are not used in optimizations because their value can change at any time. The system always reads the current value of a volatile object at the point it is requested, even if the previous instruction asked for a value from the same object. Also, the value of the object is written immediately on assignment. </p>
<p>One use of the volatile qualifier is to provide access to memory locations used by asynchronous processes such as interrupt handlers.</p>
<p>This means a value that can automatically change at any given instance. This is usually in reference to a hardware register that often has a different value ever time you read it. Specifically, it is useful to define some values as volatile so that a C compiler will not cache that value, but rather, get a fresh copy every time you request it's value. Otherwise, the compiler may return values which are inaccurate because it doesn't realized the value can change. </p>
&nbsp;
<p><span>C:\tmp&gt;type honor_volatile.c</span></p>
<p><span>#if !defined(VOLATILE)</span></p>
<p><span>#error</span></p>
<p><span>#endif</span></p>
<p><span>void test_one()</span></p>
<p><span>{</span></p>
<p><span>VOLATILE int x = 5;</span></p>
<p><span>}</span></p>
<p><span>void test_two(VOLATILE int x)</span></p>
<p><span>{</span></p>
<p><span>&nbsp;&nbsp; x = 5;</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>C:\tmp&gt;cl -O2 -c -Fa -DVOLATILE= honor_volatile.c</span></p>
<p><span>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 17.00.40308 for 80x86</span></p>
<p><span>Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.</span></p>
<p>&nbsp;</p>
<p><span>honor_volatile.c</span></p>
<p>&nbsp;</p>
<p><span>C:\tmp&gt;type honor_volatile.asm</span></p>
<p><span>; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.40308.0</span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TITLE&nbsp;&nbsp; C:\tmp\honor_volatile.c</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .686P</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .XMM</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include listing.inc</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .model&nbsp; flat</span></p>
<p>&nbsp;</p>
<p><span>INCLUDELIB LIBCMT</span></p>
<p><span>INCLUDELIB OLDNAMES</span></p>
<p>&nbsp;</p>
<p><span>PUBLIC&nbsp; _test_one</span></p>
<p><span>PUBLIC&nbsp; _test_two</span></p>
<p><span>; Function compile flags: /Ogtpy</span></p>
<p><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMDAT _test_two</span></p>
<p><span>_TEXT&nbsp;&nbsp; SEGMENT</span></p>
<p><span>_x$ = 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; size = 4</span></p>
<p><span>_test_two PROC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; COMDAT</span></p>
<p><span>; File c:\tmp\honor_volatile.c</span></p>
<p><span>; Line 15</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp; 0</span></p>
<p><span>_test_two ENDP</span></p>
<p><span>_TEXT&nbsp;&nbsp; ENDS</span></p>
<p><span>; Function compile flags: /Ogtpy</span></p>
<p><span>;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;COMDAT _test_one</span></p>
<p><span>_TEXT&nbsp;&nbsp; SEGMENT</span></p>
<p><span>_test_one PROC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; COMDAT</span></p>
<p><span>; File c:\tmp\honor_volatile.c</span></p>
<p><span>; Line 10</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp; 0</span></p>
<p><span>_test_one ENDP</span></p>
<p><span>_TEXT&nbsp;&nbsp; ENDS</span></p>
<p><span>END</span></p>
<p>&nbsp;</p>
<p><span>C:\tmp&gt;cl -O2 -c -Fa -DVOLATILE=volatile honor_volatile.c</span></p>
<p><span>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 17.00.40308 for 80x86</span></p>
<p><span>Copyright (C) Microsoft Corporation.&nbsp; All rights reserved.</span></p>
<p>&nbsp;</p>
<p><span>honor_volatile.c</span></p>
<p>&nbsp;</p>
<p><span>C:\tmp&gt;type honor_volatile.asm</span></p>
<p><span>; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.40308.0</span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TITLE&nbsp;&nbsp; C:\tmp\honor_volatile.c</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .686P</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .XMM</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include listing.inc</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .model&nbsp; flat</span></p>
<p>&nbsp;</p>
<p><span>INCLUDELIB LIBCMT</span></p>
<p><span>INCLUDELIB OLDNAMES</span></p>
<p>&nbsp;</p>
<p><span>PUBLIC&nbsp; _test_one</span></p>
<p><span>PUBLIC&nbsp; _test_two</span></p>
<p><span>; Function compile flags: /Ogtpy</span></p>
<p><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMDAT _test_two</span></p>
<p><span>_TEXT&nbsp;&nbsp; SEGMENT</span></p>
<p><span>_x$ = 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; size = 4</span></p>
<p><span>_test_two PROC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; COMDAT</span></p>
<p><span>; File c:\tmp\honor_volatile.c</span></p>
<p><span>; Line 14</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>mov&nbsp;&nbsp;&nbsp;&nbsp; DWORD PTR _x$[esp-4], 5</span></span></p>
<p><span>; Line 15</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp; 0</span></p>
<p><span>_test_two ENDP</span></p>
<p><span>_TEXT&nbsp;&nbsp; ENDS</span></p>
<p><span>; Function compile flags: /Ogtpy</span></p>
<p><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMDAT _test_one</span></p>
<p><span>_TEXT&nbsp;&nbsp; SEGMENT</span></p>
<p><span>_x$ = -4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; size = 4</span></p>
<p><span>_test_one PROC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; COMDAT</span></p>
<p><span>; File c:\tmp\honor_volatile.c</span></p>
<p><span>; Line 8</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ecx</span></p>
<p><span>; Line 9</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>mov&nbsp;&nbsp;&nbsp;&nbsp; DWORD PTR _x$[esp+4], 5</span></span></p>
<p><span>; Line 10</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ecx</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp; 0</span></p>
<p><span>_test_one ENDP</span></p>
<p><span>_TEXT&nbsp;&nbsp; ENDS</span></p>
<p><span>END<br><br>&nbsp; </p>
<p><span style="COLOR: red">And this is assembly code from VS:</span></p>
<p><span>#include</span><span>&nbsp;<span>&lt;stdio.h&gt;</span><br><span>void</span>&nbsp;main()<br>{<br>&nbsp;<span>volatile</span>&nbsp;<span>int</span>&nbsp;i=10;<br>&nbsp;<span>int</span>&nbsp;a&nbsp;=&nbsp;i;<br><br>&nbsp;printf(<span>"i=&nbsp;%d\n"</span>,a);<br>&nbsp;<span>__asm</span>&nbsp;{<br>&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-4],&nbsp;20h<br>&nbsp;}<br><br>&nbsp;<span>int</span>&nbsp;b&nbsp;=&nbsp;i;<br>&nbsp;printf(<span>"i=&nbsp;%d\n"</span>,b);<br>}</span></p>
<p>&nbsp;</p>
<p><span style="COLOR: red">Release:</span></p>
<p><span>009C1002&nbsp; in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al,dx&nbsp; </span></p>
<p><span>009C1003&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx&nbsp; </span></p>
<p><span>009C1004&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp; </span></p>
<p><span>&nbsp;volatile int i=10;</span></p>
<p><span>int a = i;</span></p>
<p>&nbsp;</p>
<p><span>printf("i= %d\n",a);</span></p>
<p><span>009C1005&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,dword ptr [__imp__printf (9C20A0h)]&nbsp; </span></p>
<p><span>009C100B&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [i],0Ah&nbsp; </span></p>
<p><span>009C1012&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i]&nbsp; </span></p>
<p><span>009C1015&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp; </span></p>
<p><span>009C1016&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset string "i= %d\n" (9C20F4h)&nbsp; </span></p>
<p><span>009C101B&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp; </span></p>
<p><span>009C101D&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp; </span></p>
<p><span>&nbsp;__asm {</span></p>
<p><span>&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4], 20h</span></p>
<p><span>009C1020&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [i],20h&nbsp; </span></p>
<p><span>&nbsp;}</span></p>
<p>&nbsp;</p>
<p><span>int b = i;</span></p>
<p><span>009C1027&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i]&nbsp; </span></p>
<p><span>&nbsp;printf("i= %d\n",b);</span></p>
<p><span>009C102A&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp; </span></p>
<p><span>009C102B&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset string "i= %d\n" (9C20F4h)&nbsp; </span></p>
<p><span>009C1030&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp; </span></p>
<p><span>009C1032&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp; </span></p>
<p><span>009C1035&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp; </span></p>
<p><span>}</span></p>
<p><span>009C1036&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,ebp&nbsp; </span></p>
<p><span>009C1038&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp; </span></p>
<p><span>009C1039&nbsp; ret&nbsp; </span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="COLOR: red">Debug:</span></p>
<p><span>#include &lt;stdio.h&gt;</span></p>
<p><span>void main()</span></p>
<p><span>{</span></p>
<p><span>001B13B0&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp; </span></p>
<p><span>001B13B1&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp; </span></p>
<p><span>001B13B3&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,0E4h&nbsp; </span></p>
<p><span>001B13B9&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp; </span></p>
<p><span>001B13BA&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp; </span></p>
<p><span>001B13BB&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp; </span></p>
<p><span>001B13BC&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi,[ebp-0E4h]&nbsp; </span></p>
<p><span>001B13C2&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,39h&nbsp; </span></p>
<p><span>001B13C7&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,0CCCCCCCCh&nbsp; </span></p>
<p><span>001B13CC&nbsp; rep stos&nbsp;&nbsp;&nbsp; dword ptr es:[edi]&nbsp; </span></p>
<p><span>&nbsp;volatile int i=10;</span></p>
<p><span>001B13CE&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [i],0Ah&nbsp; </span></p>
<p><span>&nbsp;int a = i;</span></p>
<p><span>001B13D5&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i]&nbsp; </span></p>
<p><span>001B13D8&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [a],eax&nbsp; </span></p>
<p>&nbsp;</p>
<p><span>printf("i= %d\n",a);</span></p>
<p><span>001B13DB&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,esp&nbsp; </span></p>
<p><span>001B13DD&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [a]&nbsp; </span></p>
<p><span>001B13E0&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp; </span></p>
<p><span>001B13E1&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset string "i= %d\n" (1B573Ch)&nbsp; </span></p>
<p><span>001B13E6&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [__imp__printf (1B82D4h)]&nbsp; </span></p>
<p><span>001B13EC&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp; </span></p>
<p><span>001B13EF&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,esp&nbsp; </span></p>
<p><span>001B13F1&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ILT+300(__RTC_CheckEsp) (1B1131h)&nbsp; </span></p>
<p><span>&nbsp;__asm {</span></p>
<p><span>&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4], 20h</span></p>
<p><span>001B13F6&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4],20h&nbsp; </span></p>
<p><span>&nbsp;}</span></p>
<p>&nbsp;</p>
<p><span>int b = i;</span></p>
<p><span>001B13FD&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i]&nbsp; </span></p>
<p><span>001B1400&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [b],eax&nbsp; </span></p>
<p><span>&nbsp;printf("i= %d\n",b);</span></p>
<p><span>001B1403&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,esp&nbsp; </span></p>
<p><span>001B1405&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [b]&nbsp; </span></p>
<p><span>001B1408&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp; </span></p>
<p><span>001B1409&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset string "i= %d\n" (1B573Ch)&nbsp; </span></p>
<p><span>001B140E&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [__imp__printf (1B82D4h)]&nbsp; </span></p>
<p><span>001B1414&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp; </span></p>
<p><span>001B1417&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,esp&nbsp; </span></p>
<p><span>001B1419&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @ILT+300(__RTC_CheckEsp) (1B1131h)&nbsp; </span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;type meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">#include &lt;stdio.h&gt;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">int main() {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; MEOW int i = 10;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; int a = i;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; printf("a: %d\n", a);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; __asm {<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov dword ptr [ebp - 4], 20h<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; int b = i;<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; printf("b: %d\n", b);<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">}<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 /MTd /DMEOW= meow.cpp &amp;&amp; meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">a: 10<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">b: 32<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 /MT /O2 /DMEOW= meow.cpp &amp;&amp; meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">a: 10<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">b: 10<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 /MTd /DMEOW=volatile meow.cpp &amp;&amp; meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">a: 10<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">b: 32<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">C:\Temp&gt;cl /EHsc /nologo /W4 /MT /O2 /DMEOW=volatile meow.cpp &amp;&amp; meow<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">meow.cpp<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">a: 10<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: Consolas; FONT-SIZE: 12pt">b: 32<o:p></o:p></span></p>
<p style="MARGIN: 0in 0in 0pt" class=MsoNormal><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt"><o:p>&nbsp;</o:p></span></p>
<p><span style="FONT-FAMILY: 'Verdana','sans-serif'; FONT-SIZE: 12pt; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Calibri">Volatility inhibits optimizations, as expected.</span><br></span></p>
<img src ="http://www.cppblog.com/luhputu/aggbug/142495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-22 17:55 <a href="http://www.cppblog.com/luhputu/archive/2011/03/22/142495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对const的一些认识</title><link>http://www.cppblog.com/luhputu/archive/2011/03/18/142146.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Fri, 18 Mar 2011 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/18/142146.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/142146.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/18/142146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/142146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/142146.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: consolas"><span style="COLOR: blue"><font color=#000000>以const 修饰的常量值，具有不可变性。<br>C++的编译器通常不为普通const常量分配存储空间，而是将它们保存在符号表中，这使得它成为一个编译期间的常量。<br><br><br>const 用于指针的两种情况分析：</p>
<p>int const *a; //a/可变，*a不可变</p>
<p>int *const a; //a不可变，*a可变<br></p>
<p>比如：</p>
<p>typedef char* pStr;</p>
<p>char string[4] = "abc";</p>
<p>//限定*p1不可变，当然p1可变。</p>
<p>const char* p1 = string;</p>
<p>const pStr p2 = string;</p>
<p>p1++; //可行 输出bc</p>
<p>p2++; //不可行<br></p>
<pre>const int nValue; //nValue 是const</pre>
<pre>const char* pContent; //*pContent是const, pContent可变</pre>
<pre>char* const pContent;  //pContent是const, *pContent可变</pre>
<pre>const char* const pContent; //pContent和*pContent都是const</pre>
<pre style="FONT-FAMILY: consolas"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></font><br><br><br><br><br>#include</span>&nbsp;<span style="COLOR: #a31515">&lt;iostream&gt;</span><br><span style="COLOR: blue">#include</span>&nbsp;<span style="COLOR: #a31515">&lt;string&gt;</span><br> <br><span style="COLOR: blue">using</span>&nbsp;<span style="COLOR: blue">namespace</span>&nbsp;std;<br>
<pre style="FONT-FAMILY: consolas">string&nbsp;test[]&nbsp;={<span style="COLOR: #a31515">"test"</span>};<br></pre>
<br><span style="COLOR: blue">class</span>&nbsp;StringStack<br>{<br>	<span style="COLOR: blue">static</span>&nbsp;<span style="COLOR: blue">const</span>&nbsp;<span style="COLOR: blue">int</span>&nbsp;size&nbsp;=100;<br>	<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;stack[size];<br>	<span style="COLOR: blue">int</span>&nbsp;index;<br><span style="COLOR: blue">public</span>:<br>	StringStack();</pre>
<pre style="FONT-FAMILY: consolas">         //限定参数在函数体中不可被改变<br>	<span style="COLOR: blue">void</span>&nbsp;push(<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;s);<br>	<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;pop();</pre>
<pre style="FONT-FAMILY: consolas">         //尝试去更改</pre>
<pre style="FONT-FAMILY: consolas"><span style="COLOR: blue">         const</span>&nbsp;string*&nbsp;change(string*&nbsp;s,<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;ss);<br></pre>
<pre style="FONT-FAMILY: consolas"><br><br>};<br> </pre>
<pre style="FONT-FAMILY: consolas"><span style="COLOR: blue">const</span>&nbsp;string*&nbsp;StringStack::change(string*&nbsp;s,<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;ss)<br>{<br>	ss=s;<br>	<span style="COLOR: blue">return</span>&nbsp;ss;<br>}<br>StringStack::StringStack():index(0)<br>{<br>	memset(stack,0,size&nbsp;*&nbsp;<span style="COLOR: blue">sizeof</span>(string*));<br>}<br> <br><span style="COLOR: blue">void</span>&nbsp;StringStack::push(<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;s)<br>{<br>	<span style="COLOR: blue">if</span>(index&lt;size)<br>	{</pre>
<pre style="FONT-FAMILY: consolas">                   //改变传进来的常量</pre>
<pre style="FONT-FAMILY: consolas">
<pre style="FONT-FAMILY: consolas">                   s=change(test,s);</pre>
<pre style="FONT-FAMILY: consolas">                   //在汇编中可以看出：</pre>
<pre style="FONT-FAMILY: consolas">0x0137E1C0&nbsp; 68 52 1d 00 63 72 65 61 6d 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 0f 00 00 00 00 00 00 00 b0 52 1d 00 72 69 70 70&nbsp; hR..cream.......................?R..ripp<br>0x0137E1E8&nbsp; 6c 65 00 00 00 00 00 00 00 00 00 00 06 00 00 00 0f 00 00 00 00 00 00 00 f8 52 1d 00 6c 65 6d 6f 6e 00 00 00 00 00 00 00&nbsp; le......................?R..lemon.......<br>0x0137E210&nbsp; 00 00 00 00 05 00 00 00 0f 00 00 00 00 00 00 00 40 53 1d 00 73 6f 72 62 65 74 00 00 00 00 00 00 00 00 00 00 06 00 00 00&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#46;&#64;&#83;&#46;&#46;&#115;&#111;&#114;&#98;&#101;&#116;">................@S..sorbet</a>..............<br>0x0137E238&nbsp; 0f 00 00 00 00 00 00 00 88 53 1d 00 72 6f 63 6b 79 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 0f 00 00 00 00 00 00 00&nbsp; ........?S..rocky.......................<br>0x0137E260&nbsp; d0 53 1d 00 66 75 64 67 65 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00&nbsp; ?S..fudge...............................<br>0x0137E288&nbsp; 01 00 00 00 d8 22 1d 00 88 51 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&nbsp; ....?"..?Q..............................<br>0x0137E2B0&nbsp; 00 00 00 00 00 00 00 00 00 4c cc 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&nbsp; .........L?.............................<br></pre>
stack[index++]=s;<br>	}<br>}</pre>
<pre style="FONT-FAMILY: consolas">//限定函数的返回值不可被更新。<br><span style="COLOR: blue">const</span>&nbsp;string*&nbsp;StringStack::pop()<br>{<br> <br>	<span style="COLOR: blue">if</span>(index&gt;0)<br>	{	<br>		<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;rv&nbsp;=stack[--index];<br>		stack[index]=0;<br>		<span style="COLOR: blue">return</span>&nbsp;rv;<br>	}<br>	<span style="COLOR: blue">return</span>&nbsp;0;<br>}<br><br> <br>string&nbsp;iceCream[]=<br>{<br>	<span style="COLOR: #a31515">"cream"</span>,<span style="COLOR: #a31515">"ripple"</span>,<span style="COLOR: #a31515">"lemon"</span>,<span style="COLOR: #a31515">"sorbet"</span>,<span style="COLOR: #a31515">"rocky"</span>,<span style="COLOR: #a31515">"fudge"</span>,<br>};<br> <br><span style="COLOR: blue">const</span>&nbsp;<span style="COLOR: blue">int</span>&nbsp;iCsz=<span style="COLOR: blue">sizeof</span>&nbsp;iceCream&nbsp;/&nbsp;<span style="COLOR: blue">sizeof</span>&nbsp;*iceCream;<br> <br><span style="COLOR: blue">int</span>&nbsp;main()<br>{<br>	StringStack&nbsp;ss;<br>	<span style="COLOR: blue">for</span>(<span style="COLOR: blue">int</span>&nbsp;i=0;i&lt;iCsz;i++)<br>	{<br>		ss.push(&amp;iceCream[i]);<br>	}<br>	<span style="COLOR: blue">const</span>&nbsp;string*&nbsp;cp;<br>	<span style="COLOR: blue">while</span>((cp=ss.pop())!=0)</pre>
<pre style="FONT-FAMILY: consolas"> // ss已经指向了test;所以输出的都是test;<br><br>		cout&lt;&lt;*cp&lt;&lt;endl;<br>}</pre>
<img src ="http://www.cppblog.com/luhputu/aggbug/142146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-18 16:32 <a href="http://www.cppblog.com/luhputu/archive/2011/03/18/142146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++/CLI to C++ Tips and Tricks</title><link>http://www.cppblog.com/luhputu/archive/2011/03/03/141040.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Thu, 03 Mar 2011 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/03/141040.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/141040.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/03/141040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/141040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/141040.html</trackback:ping><description><![CDATA[orignal reference: http://blogs.msdn.com/b/jsocha/archive/2011/03/02/c-cli-to-c-tips-and-tricks.aspx<br><span class=user-name><a class="internal-link view-user-profile" href="http://www.cppblog.com/John-Socha_2D00_Leialoha/ProfileUrlRedirect.ashx"><span></span><u><font color=#0066cc>John Socha-Leialoha - MSFT</font></u></a><br>
<p>In my previous post, <a href="http://blogs.msdn.com/b/jsocha/archive/2010/11/19/writing-unit-tests-in-visual-studio-for-native-c.aspx">Writing Unit Tests in Visual Studio for Native C++</a>, I described the approach I&#8217;m using to write unit tests for native C++ code by using C++/CLI, which is C++ code that runs inside the .NET runtime. Because of this &#8220;mixed&#8221; programming model, there are some techniques you may need to employ between C++ and C++/CLI code.</p>
<h1>Class Instance Variables</h1>
<p>The instance variables in C++/CLI classes are different from instance variables in na&#239;ve C++, which means you can&#8217;t mix the two blindly. For example, you can&#8217;t use native C++ classes as instance variables in your test class. The following, for example, will not compile:</p>
<div>
<pre style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: rgb(244,244,244); MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; COLOR: black; FONT-SIZE: 8pt; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet><font style="BACKGROUND-COLOR: #f4f4f4"><font><span style="COLOR: rgb(0,0,255)">public</span> ref </font><span style="COLOR: rgb(0,0,255)">class</span></font> MyFixture<br>{<br>    MyClass m_instance;<br>};</pre>
</div>
<div></div>
<div>You&#8217;ll get the following error message: <br></div>
<blockquote>
<p>error C4368: cannot define 'm_instance' as a member of managed 'Tests::MyFixture': mixed types are not supported</p>
</blockquote>
<p>So how do you deal with this? Instead of using a class as the type, you have to use pointers and then create/destroy the instance in the TestInitialize and TestCleanup code:</p>
<div id=codeSnippetWrapper>
<pre style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: rgb(244,244,244); MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; COLOR: black; FONT-SIZE: 8pt; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet>
<p><span style="COLOR: rgb(0,0,255)">public</span> ref <span style="COLOR: rgb(0,0,255)">class</span> MyFixture<br>{<br>    [TestInitialize]<br>    <span style="COLOR: rgb(0,0,255)">void</span> Initialize()<br>    {<br>        m_pInstance = <span style="COLOR: rgb(0,0,255)">new</span> MyClass();<br>    }</p>
<p><br><br>    [TestCleanup]<br>    <span style="COLOR: rgb(0,0,255)">void</span> Cleanup()<br>    {<br>        <span style="COLOR: rgb(0,0,255)">delete</span> m_pInstance;<br>    }</p>
<p><br><br>    MyClass *m_pInstance;<br>};</p>
</pre>
<br></div>
<p>The methods marked by TestInitialize and TestCleanup run before and after each test method.</p>
<h1>Passing a Pointer to an Instance Variable</h1>
<p>C++/CLI instance variables have a type of interior_ptr&lt;T&gt; instead of the type you wrote in your code. This makes a difference if you attempt to pass either the address or a reference to this instance variable to a native C++ method or function. For example, given the class above, you might think you could write a call to one of your native methods like this:</p>
<div id=codeSnippetWrapper>
<pre style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: rgb(244,244,244); MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; COLOR: black; FONT-SIZE: 8pt; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet>p-&gt;SomeMethod(&amp;m_pInstance);</pre>
<br></div>
<p>Compile this and you&#8217;ll see this message:</p>
<blockquote>
<p>error C2664: 'Tests::MyFixture::MyTest' : cannot convert parameter 2 from 'cli::interior_ptr&lt;Type&gt;' to 'MyClass **'</p>
</blockquote>
<p>This error appears because .NET uses a heap—items on the heap can be moved as a result of garbage collection. In order to send a pointer to a native method/function, you need to &#8220;pin&#8221; the pointer for the duration of the call, which you can do like this:</p>
<div id=codeSnippetWrapper>
<pre style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: rgb(244,244,244); MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; COLOR: black; FONT-SIZE: 8pt; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet>cli::pin_ptr&lt;MyClass *&gt; p = &amp;m_pInstance;<br>SomeMethod(<span style="COLOR: rgb(0,0,255)"><font style="BACKGROUND-COLOR: #f4f4f4">static_cast</font></span>&lt;MyClass **&gt;(p));</pre>
<br></div>
<p>Once the variable p either goes out of scope, or is assigned a new value, the pointer will be free to change again.</p>
<p>When you&#8217;re dealing with helper methods in your test code, you can also write this type of code:</p>
<div id=codeSnippetWrapper>
<pre style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: rgb(244,244,244); MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: 'Courier New', courier, monospace; DIRECTION: ltr; COLOR: black; FONT-SIZE: 8pt; OVERFLOW: visible; PADDING-TOP: 0px" id=codeSnippet>Helper(&amp;m_pInstance);<br>...<br><font style="BACKGROUND-COLOR: #f4f4f4"><font><span style="COLOR: rgb(0,0,255)">void</span> Helper(cli::interior_ptr&lt;MyClass *&gt; ppInstance)<br>{<br>    **ppInstance = </font><span style="COLOR: rgb(0,0,255)">new</span></font> MyClass();<br>}</pre>
</div>
</span>
<img src ="http://www.cppblog.com/luhputu/aggbug/141040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-03 11:19 <a href="http://www.cppblog.com/luhputu/archive/2011/03/03/141040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Are lambdas preferable to bind nowadays?  Which would you write?</title><link>http://www.cppblog.com/luhputu/archive/2011/03/02/141001.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Wed, 02 Mar 2011 09:59:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/02/141001.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/141001.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/02/141001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/141001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/141001.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>function&lt;<span>void</span>()&gt; task = bind( &amp;File::HashFile, <span>static_cast</span>&lt;HashFn&gt;(bind(&amp;Comparator::CompareData, ref(compare), _1, _2, _3, <span>false</span>)), ref(*pFile1) );</span></p>
<p><span>function&lt;<span>void</span>()&gt; task = [&amp;](){ File::HashFile( bind(&amp;Comparator::CompareData, ref(compare), _1, _2, _3, <span>false</span>), *pFile1 ); };</span></p>
<p><span>function&lt;<span>void</span>()&gt; task = [&amp;](){ File::HashFile([&amp;](<span>const</span> <span>void</span> *pv, size_t cb, <span>const</span> <span>char</span> *szDesc) { compare.CompareData(pv, cb, szDesc, <span>false</span>); }, *pFile1 ); };</span></p>
<p>&nbsp;</p>
<p>(Random comment: The 170 lines of incomprehensible errors you get if you forget the static_cast&lt;HashFn&gt; on the first line is completely obnoxious.&nbsp; [HashFn is a typedef for function&lt;void(const void *, size_t, const char *)&gt;])<br><br>&nbsp; </p>
<p><span>The last one is the best</span></p>
<p><span>Lambdas supersede bind() 99% of the time - they are easier to read, easier to write, more efficient, and don't explode horribly.&nbsp; The remaining 1% of cases are better handled by handwritten functors (e.g. with templated function call operators).</span></p>
<p><span>This is especially true now that 16.1/VC11's lambdas v1.1 handle nested lambdas just fine.&nbsp; (In contrast, nested bind() is a bug farm, which has been tormenting me for years.)<br><br>&nbsp; </p>
<p><span>I wish it was true&#8230;</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Lambdas aren&#8217;t polymorphic (and even when I write my own ad hoc function objects I prefer to make them stateless and just use bind for state)</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>You do not have to specify the argument(s) type(s)</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>IMHO, for simple bindings, bind is easier to read</span></p>
<p><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Bind has been around for so many years that, at least to me, it just come natural.</span></p>
<p><span>I completely agree about nested binds: understanding them is mindbending.</span></p>
</span>
<img src ="http://www.cppblog.com/luhputu/aggbug/141001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-02 17:59 <a href="http://www.cppblog.com/luhputu/archive/2011/03/02/141001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nullptr/__nullptr</title><link>http://www.cppblog.com/luhputu/archive/2011/03/02/141000.html</link><dc:creator>Enki</dc:creator><author>Enki</author><pubDate>Wed, 02 Mar 2011 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/luhputu/archive/2011/03/02/141000.html</guid><wfw:comment>http://www.cppblog.com/luhputu/comments/141000.html</wfw:comment><comments>http://www.cppblog.com/luhputu/archive/2011/03/02/141000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luhputu/comments/commentRss/141000.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luhputu/services/trackbacks/141000.html</trackback:ping><description><![CDATA[&nbsp;
<p>MSDN has conflicting information about nullptr/__nullptr and /clr:</p>
<p>&nbsp;</p>
<p><a href="http://msdn.microsoft.com/en-us/library/dd465215(VS.100).aspx">http://msdn.microsoft.com/en-us/library/dd465215(VS.100).aspx</a> says:</p>
<p>The Visual C++ compiler lets you use the&nbsp;<a href="http://msdn.microsoft.com/en-us/library/4ex65770.aspx">nullptr</a>&nbsp;keyword with native code or with managed code. ... The compiler interprets&nbsp;nullptr&nbsp;to be managed code when you use the&nbsp;<a href="http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx">/clr</a>&nbsp;compiler option, and native code when you do not use the&nbsp;/clr&nbsp;option.</p>
<p>&nbsp;</p>
<p>Then adds:</p>
<p>The Microsoft-specific&nbsp;__nullptr&nbsp;keyword has the same meaning as&nbsp;nullptr, but it applies to native code only. If you compile native C/C++ code by using the&nbsp;/clr&nbsp;compiler option, the compiler cannot determine whether the&nbsp;nullptr&nbsp;keyword is a native or a managed term. To make your intention clear to the compiler, use the&nbsp;nullptr&nbsp;keyword to specify the managed term, and&nbsp;__nullptr&nbsp;to specify the native term.</p>
<p>&nbsp;</p>
<p>Highlighted part indicates that compiler cannot determine whether it is native or managed, but the previous paragraph just said it will interpret it as managed.</p>
<p>&nbsp;</p>
<p><a href="http://msdn.microsoft.com/en-us/library/4ex65770.aspx" target=_blank>http://msdn.microsoft.com/en-us/library/4ex65770.aspx</a>&nbsp;says the same "cannot determine" thing and then gives an example to contrary:</p>
<p>&nbsp;</p>
<p>The following sample shows that&nbsp;nullptr&nbsp;can be assigned to a native pointer when you compile with&nbsp;/clr.</p>
<pre>// mcpp_nullptr_6.cpp</pre>
<pre>// compile with: /clr</pre>
<pre>int main() {</pre>
<pre>&nbsp;&nbsp; int * i = 0;</pre>
<pre>&nbsp;&nbsp; int * j = nullptr;</pre>
<pre>}</pre>
<pre>So what&nbsp;should I expect from all of this? I am guessing that the compiler takes nullptr as managed with /clr,<br>&nbsp;because otherwise there wouldn't be a way to say nullptr in managed, and the sample is just an old garbage?<br>&nbsp; </pre>
<pre>Here's how it's supposed to work, and what MSDN should say:</pre>
<pre>__nullptr is always the Native Nullptr, regardless of whether the compilation is native, /clr, or /clr:pure.</pre>
<pre>std::nullptr_t is always the Native Nullptr's Type, regardless of whether the compilation is native, /clr, or /clr:pure.&nbsp; It is defined by &lt;cstddef&gt;.&nbsp; For good measure (as permitted but not required by C++0x), both &lt;cstddef&gt; and &lt;stddef.h&gt; define both std::nullptr_t and ::nullptr_t.&nbsp; JonCaves even made the compiler join the fun - it defines std::nullptr_t (but not ::nullptr_t) even in the absence of any headers whatsoever.</pre>
<pre>nullptr is the Native Nullptr when compiled as native (as required by C++0x).</pre>
<pre>nullptr is the Managed Nullptr Of Doom when compiled as /clr or /clr:pure (as required by the Necronomicon, </pre>
<pre>which is to say C++/CLI).</pre>
<pre>That said, I don't know how the Managed Nullptr works, except that I've heard that "it doesn't have a type", </pre>
<pre>a concept from which my mind recoils in fear.&nbsp; There's been a little talk of unifying these things, </pre>
<pre>but I don't think anybody has figured out what that would involve yet.&nbsp; When this came up I said:</pre>
<pre>&gt; Regarding A Tale Of Two Nullptrs, I've heard several times that the problem is that the managed nullptr </pre>
<pre>"doesn't have a type", whatever that means, while the native nullptr has a type.&nbsp; </pre>
<pre>I don't know what it'd take to unify them (I assume that the native nullptr would have to "win", </pre>
<pre>since it cannot be infected with managedness, and conversions to managed stuff would have to be added to make </pre>
<pre>up the difference - and too bad for anyone who inspects nullptr closely and is surprised to discover that it </pre>
<pre>now has a type - I think all of those words in that order make sense), other than the fact that it </pre>
<pre>wasn't obviously simple enough for JonCaves to do in the first place.</pre>
<pre>&gt; The Iron Nullptr Curtain causes more user suffering than STL suffering, though - </pre>
<pre>our only real interaction is in the definition of std::nullptr_t where we simply say decltype(__nullptr). &nbsp;</pre>
<pre>In the rest of our implementation, we just use NULL/0 (Dinkumware overwhelmingly prefers 0, as I recall).<br></pre>
<pre>&nbsp;
<p><span>In this case, perhaps the ambiguity in the docs is a reflection of the thing itself. If nullptr is always <br>the MNOD when compiled with /clr, then why does the compiler allow int* j to be initialized with it, <br>as shown in the code example referred to below? I don&#8217;t know why the docs say &#8220;the compiler cannot determine&#8230;&#8221; <br>because at least in these simple initializations it seems to know what to do (converting nullptr to nullptr_t <br>when the lhs is a native type, regardless of /clr?). But I&#8217;m curious what pain this causes or might cause for users. <br>Is there ever a case where the non-identity of these two things leaks out? If so, then we should really mention that <br>in the docs.</span></p>
<p>&nbsp;</p>
<pre><span>// mcpp_nullptr_6.cpp</span></pre>
<pre><span>// compile with: /clr</span></pre>
<pre><span>int main() {</span></pre>
<pre><span>&nbsp;&nbsp; int * i = 0;</span></pre>
<pre><span>&nbsp;&nbsp; int * j = nullptr; //what IS j now?</span></pre>
<pre><span>&nbsp;&nbsp; int^ k = nullptr; //the same or different?</span></pre>
<pre><span>}</span></pre>
</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;</pre>
<pre>&nbsp;
<p><span>C:\Temp&gt;type doooooooom.cpp</span></p>
<p><span>#include &lt;iostream&gt;</span></p>
<p><span>#include &lt;memory&gt;</span></p>
<p><span>#include &lt;ostream&gt;</span></p>
<p><span>using namespace std;</span></p>
<p>&nbsp;</p>
<p><span>int main() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp; auto sp = make_shared&lt;int *&gt;(nullptr);</span></p>
<p><span>&nbsp;&nbsp;&nbsp; cout &lt;&lt; sp.get() &lt;&lt; endl;</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>C:\Temp&gt;cl /EHsc /nologo /W4 doooooooom.cpp</span></p>
<p><span>doooooooom.cpp</span></p>
<p>&nbsp;</p>
<p><span>C:\Temp&gt;doooooooom</span></p>
<p><span>00227B2C</span></p>
<p>&nbsp;</p>
<p><span>C:\Temp&gt;cl /clr /nologo /W4 doooooooom.cpp</span></p>
<p><span>doooooooom.cpp</span></p>
<p><span>doooooooom.cpp(7) : error C2664: 'std::tr1::shared_ptr&lt;_Ty&gt; std::tr1::make_shared&lt;int*,nullptr&gt;(_Arg0 &amp;&amp;)' : cannot conv</span></p>
<p><span>ert parameter 1 from 'nullptr' to 'nullptr &amp;&amp;'</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Ty=int *,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Arg0=nullptr</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nullptr can only be converted to pointer or handle types</span></p>
<p><span>doooooooom.cpp(7) : fatal error C1903: unable to recover from previous error(s); stopping compilation</span></p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></pre>
<img src ="http://www.cppblog.com/luhputu/aggbug/141000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luhputu/" target="_blank">Enki</a> 2011-03-02 17:58 <a href="http://www.cppblog.com/luhputu/archive/2011/03/02/141000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>