﻿<?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++博客-MyMSDN</title><link>http://www.cppblog.com/mymsdn/</link><description>MyMSDN记录开发新知道</description><language>zh-cn</language><lastBuildDate>Wed, 22 Apr 2026 22:36:28 GMT</lastBuildDate><pubDate>Wed, 22 Apr 2026 22:36:28 GMT</pubDate><ttl>60</ttl><item><title>关于protobuf中的field_number范围的解释</title><link>http://www.cppblog.com/mymsdn/archive/2011/03/19/142184.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Fri, 18 Mar 2011 18:01:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2011/03/19/142184.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/142184.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2011/03/19/142184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/142184.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/142184.html</trackback:ping><description><![CDATA[<!--MyMSDN style!--><link rel="stylesheet" type="text/css" href="http://files.cnblogs.com/volnet/gocool.css"> <style type="text/css">
body{background-color:#eeeeee;}
</style>  <div>以下是来自Google Protobuf Documents里的一句话： </div> <div class="quote">As you can see, each field in the message definition has a unique numbered tag. These tags are used to identify your fields in the <a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">message binary format</a>, and should not be changed once your message type is in use. Note that tags with values in the range 1 through 15 take one byte to encode. Tags in the range 16 through 2047 take two bytes. So you should reserve the tags 1 through 15 for very frequently occurring message elements. Remember to leave some room for frequently occurring elements that might be added in the future. </div> <div>这里要做一个解释，就是为什么是1到15，以及16到2047呢？</div> <div> <ol> <li>1到15，仅使用1bytes。每个byte包含两个部分，一个是field_number一个是tag，其中field-number就是protobuf中每个值后等号后的数字（在C++和Java中，如果不设置这个值，则它是随机的，如果在Python中，不设置，它则不被处理（这个在<a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">message binary format</a>中的Field Order一节中有提到）。那么我们可以认为这个field_number是必须的。那么一个byte用来表达这个值就是<span style="color: red">0</span><span style="color: blue">00000</span><span style="color: green">000</span>，其中红色表示是否有后续字节，如果为0表示没有也就是这是一个字节，蓝色部分表示field-number，绿色部分则是wire_type部分，表示数据类型。也就是(field_number &lt;&lt; 3) | wire_type。其中wire_type只有3位，表示数据类型。那么能够表示field_number的就是5位蓝色的数字，5位数字能够表达的最大范围就是1-15（其中0是无效的）。  <li>16到2047，与上面的规则其实类似，下面以2bytes为例子，那么就有<span style="color: red">1</span><span style="color: blue">0000000 <span style="color: red">0</span>0000</span><span style="color: green">000</span>，其中红色部分依然是符号位，因为每个byte的第一位都用来表示下一byte是否和自己有关，那么对于>1byte的数据，第一位一定是1，因为这里假设是2byte，那么第二个byte的第一位也是红色，刨除这两位，再扣掉3个wire_type位，剩下11位（2*8-2-3），能够表达的数字范围就是2047（2<sup>11</sup>）。</li></ol></div> <div> 参考资料：<br /> <ol><li>http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/proto.html</li> <li>http://code.google.com/apis/protocolbuffers/docs/encoding.html</li></ol> </div><img src ="http://www.cppblog.com/mymsdn/aggbug/142184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2011-03-19 02:01 <a href="http://www.cppblog.com/mymsdn/archive/2011/03/19/142184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zig-zag编码方式</title><link>http://www.cppblog.com/mymsdn/archive/2011/03/19/zig-zag-encoding.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Fri, 18 Mar 2011 16:36:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2011/03/19/zig-zag-encoding.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/142182.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2011/03/19/zig-zag-encoding.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/142182.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/142182.html</trackback:ping><description><![CDATA[zig-zag：就是把（-1）1000 0001变成0000 0011，注意最后一个1是符号位，也就是2，那么如果是个int32的话，1000 0000 0000 0000 0000 0000 0000 0001 就变成了000 0000 0000 0000 0000 0000 0000 00011，那么也就是11了，那么可以节约很多符号位。<a  href="http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/encoding.html">http://goo.gl/2wRKb</a><br>用位运算来表示把一个负数转换成zig-zag编码，就是<span class="pun"><span style="font-family: monospace;"><br></span><br>int32是：(</span><span class="pln">n </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">^</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">31</span>)<br>int64是：<span class="pun">(</span><span class="pln">n </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">^</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">63</span><span class="pun">)</span>
<pre class="prettyprint"><span class="pun">也就是说，如果是负数，对于32位最多能省去30格（其中1格是符号位，另一个代表最小值1，此处假设&#8220;正负0&#8221;不合法）。同理，64位最多能省去62位。当然比较极端的是所有的位数都被用上了。<br></span></pre>
<br><img src ="http://www.cppblog.com/mymsdn/aggbug/142182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2011-03-19 00:36 <a href="http://www.cppblog.com/mymsdn/archive/2011/03/19/zig-zag-encoding.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统</title><link>http://www.cppblog.com/mymsdn/archive/2010/09/06/125966.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Sun, 05 Sep 2010 18:06:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/09/06/125966.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/125966.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/09/06/125966.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/125966.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/125966.html</trackback:ping><description><![CDATA[<p>如何当前操作系统是不是64位？如何判断当前应用程序是否在Wow64下运行？</p> <p>首先什么是Wow64？很多朋友一看到64就认为这个方法是判断当前系统是否是64bit的，其实不然。Wow64是Windows-On-Windows64的意思，它是指在64位的操作系统上（不是指64位的CPU）运行32位应用程序的兼容平台。</p> <p>下面是MSDN中一段IsWow64的应用程序：</p><pre class="gc-code"><span style="color: #010001">BOOL IsWow64</span>() 
{ 
    <span style="color: blue">typedef </span><span style="color: #010001">BOOL </span>(<span style="color: #010001">WINAPI </span>*<span style="color: #010001">LPFN_ISWOW64PROCESS</span>) (<span style="color: #010001">HANDLE</span>, <span style="color: #010001">PBOOL</span>); 
    <span style="color: #010001">LPFN_ISWOW64PROCESS fnIsWow64Process</span>; 
    <span style="color: #010001">BOOL bIsWow64 </span>= <span style="color: #010001">FALSE</span>; 
    <span style="color: #010001">fnIsWow64Process </span>= (<span style="color: #010001">LPFN_ISWOW64PROCESS</span>)<span style="color: #010001">GetProcAddress</span>( <span style="color: #010001">GetModuleHandle</span>(<span style="color: #010001">_T</span>(<span style="color: #a31515">"kernel32"</span>)), <span style="color: #a31515">"IsWow64Process"</span>); 
    <span style="color: blue">if </span>(<span style="color: #010001">NULL </span>!= <span style="color: #010001">fnIsWow64Process</span>) 
    {
        <span style="color: #010001">fnIsWow64Process</span>(<span style="color: #010001">GetCurrentProcess</span>(),&amp;<span style="color: #010001">bIsWow64</span>); 
    } 
    <span style="color: blue">return </span><span style="color: #010001">bIsWow64</span>; 
}</pre>
<p>下面的代码用来检测这个程序的结果：</p><pre class="gc-code"><span style="color: blue">if</span>( <span style="color: #010001">IsWow64</span>() == <span style="color: #010001">TRUE </span>)
{
    <span style="color: #010001">_tprintf</span>(<span style="color: #010001">_T</span>(<span style="color: #a31515">"IsWow64() == TRUE\n"</span>));
}
<span style="color: blue">else
</span>{
    <span style="color: #010001">_tprintf</span>(<span style="color: #010001">_T</span>(<span style="color: #a31515">"IsWow64() == FALSE\n"</span>));
}
</pre>
<p>让我们编译一下这个程序。</p>
<p>我们需要的是64位的操作系统，比如XP64bit，Windows 2008 R2等都是64bit操作系统。</p>
<p>在64位的操作系统上运行的kernel32.dll中，将会实现IsWow64Process方法，而在32位系统中提供的kernel32.dll中则没有提供相关函数的实现。</p>
<p>比较迷惑人的则是bIsWow64，其实仔细看MSDN中的Remark，会发现：</p>
<p>If the application is a 64-bit application running under 64-bit Windows, the <i>Wow64Process</i> parameter is set to FALSE.也就是说64位应用程序跑在64位的操作系统上，bIsWow64的值将是FALSE而不是TRUE。 
<p>因此我们需要分别将我们的程序编译成Win32平台和x64平台的，如果你用Visual Studio进行编译，默认安装则只包含32位的编译器/链接器，即便你是在64位操作系统上安装，也是一样的。你需要在VC++节点下勾选x64选项才可以，Itanium则需要在Server平台下安装才可勾选。然后在编译的时候，分别选择Win32和x64进行编译。 
<p><a href="http://www.cppblog.com/images/cppblog_com/mymsdn/WindowsLiveWriter/IsWow64Windows32bit64bit_14E3/image_2.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/mymsdn/WindowsLiveWriter/IsWow64Windows32bit64bit_14E3/image_thumb.png" width="339" height="92"></a> 
<p>编译后，运行，结果如我们分析的一样： 
<p>在64位系统上运行Win32编译配置的结果是IsWow64() == TRUE，而x64编译配置的结果是IsWow64() == FALSE。 
<p>如果想要知道当前系统是否是64位的，则可以通过下面的方法：</p><pre class="gc-code"><span style="color: #010001">BOOL Is64bitSystem</span>()
{
    <span style="color: #010001">SYSTEM_INFO si</span>;
    <span style="color: #010001">GetNativeSystemInfo</span>(&amp;<span style="color: #010001">si</span>);

    <span style="color: blue">if </span>(<span style="color: #010001">si</span>.<span style="color: #010001">wProcessorArchitecture </span>== <span style="color: #010001">PROCESSOR_ARCHITECTURE_AMD64 </span>||    
        <span style="color: #010001">si</span>.<span style="color: #010001">wProcessorArchitecture </span>== <span style="color: #010001">PROCESSOR_ARCHITECTURE_IA64 </span>)
    {
        <span style="color: blue">return </span><span style="color: #010001">TRUE</span>;
    }
    <span style="color: blue">else
    </span>{
        <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
    } 
}</pre>
<p>注意：需要注意是GetNativeSystemInfo&nbsp; 函数从Windows XP 开始才有， 而 IsWow64Process&nbsp; 函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。 </p><img src ="http://www.cppblog.com/mymsdn/aggbug/125966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-09-06 02:06 <a href="http://www.cppblog.com/mymsdn/archive/2010/09/06/125966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>英特尔&amp;reg; 多线程应用开发指南</title><link>http://www.cppblog.com/mymsdn/archive/2010/09/05/125912.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Sat, 04 Sep 2010 18:20:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/09/05/125912.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/125912.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/09/05/125912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/125912.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/125912.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://software.intel.com/zh-cn/articles/intel-guide-for-developing-multithreaded-applications/ 英特尔® 多线程应用开发指南 提交新文章  Published On :&nbsp; 2010年02月25日 20:00  评级  请登录后评级！当前分数： 0 由 0 用户  请登录后评级！当前分数： 0 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/mymsdn/archive/2010/09/05/125912.html'>阅读全文</a><img src ="http://www.cppblog.com/mymsdn/aggbug/125912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-09-05 02:20 <a href="http://www.cppblog.com/mymsdn/archive/2010/09/05/125912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于宏MAX_PATH与文件名长度的关系</title><link>http://www.cppblog.com/mymsdn/archive/2010/09/04/125870.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Sat, 04 Sep 2010 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/09/04/125870.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/125870.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/09/04/125870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/125870.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/125870.html</trackback:ping><description><![CDATA[<p>目的：测试MAX_PATH路径与文件名的关系。</p> <p>结论：MAX_PATH代表从盘符开始到文件名结尾的C字符串长度（长度+1）的最大长度。也就是假设C:\a.txt共8个字符，长度为9，MAX_PATH通常为260，其中这个文件全名的长度不能大于260。</p> <p>测试代码：</p> <p><a href="http://www.cppblog.com/images/cppblog_com/mymsdn/WindowsLiveWriter/253adb4ca2e0_C354/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/mymsdn/WindowsLiveWriter/253adb4ca2e0_C354/image_thumb.png" width="702" height="468"></a></p><pre class="gc-code"><span style="color: blue">#include </span><span style="color: #a31515">"stdafx.h"
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;atlbase.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;windows.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;atlfile.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;atlstr.h&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;iostream&gt;
</span><span style="color: blue">#include </span><span style="color: #a31515">&lt;string&gt;

</span><span style="color: #010001">BOOL IsFileExist</span>( <span style="color: #010001">LPCTSTR lpszFileName </span>)
{
    <span style="color: #010001">DWORD dwAttr </span>= ::<span style="color: #010001">GetFileAttributes</span>( <span style="color: #010001">lpszFileName </span>);
    <span style="color: blue">if </span>( <span style="color: #010001">dwAttr </span>== 0xFFFFFFFF )
    {
        <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
    }
    <span style="color: blue">if </span>( ( <span style="color: #010001">dwAttr </span>&amp; <span style="color: #010001">FILE_ATTRIBUTE_DIRECTORY </span>) &gt; 0 )
    {
        <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
    }
    <span style="color: blue">return </span><span style="color: #010001">TRUE</span>;
}

<span style="color: #010001">BOOL DeleteFiles</span>( <span style="color: #010001">LPCTSTR lpszPath </span>)
{
    <span style="color: #010001">TCHAR szFrom</span>[<span style="color: #010001">_MAX_PATH</span>+1] = {<span style="color: #010001">_T</span>( <span style="color: #a31515">'\0' </span>)};
    <span style="color: #010001">lstrcpy</span>( <span style="color: #010001">szFrom </span>, <span style="color: #010001">lpszPath </span>);
    <span style="color: #010001">SHFILEOPSTRUCT shf</span>;
    <span style="color: #010001">memset</span>( &amp;<span style="color: #010001">shf</span>, 0, <span style="color: blue">sizeof</span>( <span style="color: #010001">SHFILEOPSTRUCT </span>) );
    <span style="color: #010001">shf</span>.<span style="color: #010001">hwnd </span>= <span style="color: #010001">NULL</span>;
    <span style="color: #010001">shf</span>.<span style="color: #010001">pFrom </span>= <span style="color: #010001">szFrom</span>;
    <span style="color: #010001">shf</span>.<span style="color: #010001">wFunc </span>= <span style="color: #010001">FO_DELETE</span>;
    <span style="color: #010001">shf</span>.<span style="color: #010001">fFlags </span>= <span style="color: #010001">FOF_NOCONFIRMMKDIR </span>| <span style="color: #010001">FOF_NOCONFIRMATION </span>|
        <span style="color: #010001">FOF_NOERRORUI </span>| <span style="color: #010001">FOF_SILENT</span>;
    <span style="color: blue">return </span><span style="color: #010001">SHFileOperation</span>( &amp;<span style="color: #010001">shf </span>) == 0;

}

<span style="color: #010001">BOOL WriteBinaryBytesToFile</span>( <span style="color: #010001">LPCTSTR fileName</span>, <span style="color: blue">unsigned char</span>* <span style="color: #010001">data</span>, 
                       <span style="color: blue">unsigned int </span><span style="color: #010001">datasize </span>, <span style="color: #010001">BOOL bAppend </span>)
{
    <span style="color: #010001">CAtlFile file</span>;
    <span style="color: blue">if</span>( !<span style="color: #010001">bAppend </span>&amp;&amp; <span style="color: #010001">IsFileExist</span>( <span style="color: #010001">fileName </span>))
        <span style="color: #010001">DeleteFiles</span>( <span style="color: #010001">fileName </span>);

    <span style="color: #010001">HRESULT ret </span>= <span style="color: #010001">file</span>.<span style="color: #010001">Create</span>( <span style="color: #010001">fileName</span>, <span style="color: #010001">FILE_WRITE_DATA</span>, <span style="color: #010001">FILE_SHARE_WRITE</span>, <span style="color: #010001">bAppend</span>?<span style="color: #010001">OPEN_ALWAYS</span>:<span style="color: #010001">CREATE_ALWAYS </span>);
    <span style="color: blue">if </span>( !<span style="color: #010001">SUCCEEDED</span>( <span style="color: #010001">ret </span>) )
        <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
    <span style="color: blue">if</span>( <span style="color: #010001">bAppend </span>)
    {
        <span style="color: #010001">file</span>.<span style="color: #010001">Seek</span>( 0, <span style="color: #010001">FILE_END </span>);
    }
    <span style="color: blue">unsigned char </span>*<span style="color: #010001">pos </span>= <span style="color: #010001">data</span>;
    <span style="color: blue">while</span>( <span style="color: #010001">datasize </span>&gt; 0 )
    {
        <span style="color: #010001">DWORD dwWrite </span>= 0;
        <span style="color: blue">if </span>( <span style="color: #010001">file</span>.<span style="color: #010001">Write</span>( <span style="color: #010001">pos </span>, <span style="color: #010001">datasize </span>, &amp;<span style="color: #010001">dwWrite </span>) != <span style="color: #010001">S_OK </span>)
        {
            <span style="color: #010001">file</span>.<span style="color: #010001">Close</span>();
            <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
        }
        <span style="color: #010001">datasize </span>-= <span style="color: #010001">dwWrite</span>;
        <span style="color: #010001">pos </span>+= <span style="color: #010001">dwWrite</span>;
    }
    <span style="color: #010001">file</span>.<span style="color: #010001">Close</span>();
    <span style="color: blue">return </span><span style="color: #010001">TRUE</span>;
}

<span style="color: #010001">BOOL GCreateFile</span>(<span style="color: #010001">std</span>::<span style="color: #010001">string</span>&amp; <span style="color: #010001">fileNamePath</span>,
                <span style="color: #010001">std</span>::<span style="color: #010001">string</span>&amp; <span style="color: #010001">fileNameExt</span>,
                <span style="color: blue">int </span><span style="color: #010001">shortNameLength</span>,
                <span style="color: #010001">std</span>::<span style="color: #010001">string</span>&amp; <span style="color: #010001">data</span>)
{
    <span style="color: blue">char </span><span style="color: #010001">c</span>[] = <span style="color: #a31515">"a"</span>;
    <span style="color: #010001">std</span>::<span style="color: #010001">string fileName</span>;
    <span style="color: #010001">fileName</span>.<span style="color: #010001">append</span>(<span style="color: #010001">fileNamePath</span>);
    <span style="color: blue">while</span>( <span style="color: #010001">shortNameLength</span>-- )
    {
        <span style="color: #010001">fileName</span>.<span style="color: #010001">append</span>(<span style="color: #010001">c</span>);
        ++*<span style="color: #010001">c</span>;
        <span style="color: blue">if</span>( *<span style="color: #010001">c </span>&gt; <span style="color: #a31515">'z' </span>)
        {
            *<span style="color: #010001">c </span>= <span style="color: #a31515">'a'</span>;
        }
    }
    <span style="color: #010001">fileName</span>.<span style="color: #010001">append</span>(<span style="color: #010001">fileNameExt</span>);

    <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"fileName:" </span>&lt;&lt; <span style="color: #010001">fileName </span>&lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;
    <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"fileName.size():"</span>&lt;&lt; <span style="color: #010001">fileName</span>.<span style="color: #010001">size</span>() &lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;
    <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"MAX_PATH" </span>&lt;&lt; <span style="color: #010001">MAX_PATH </span>&lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;

    <span style="color: blue">if</span>( <span style="color: #010001">WriteBinaryBytesToFile</span>(<span style="color: #010001">fileName</span>.<span style="color: #010001">c_str</span>(), (<span style="color: blue">unsigned char</span>*)<span style="color: #010001">data</span>.<span style="color: #010001">data</span>(), <span style="color: #010001">data</span>.<span style="color: #010001">size</span>(), <span style="color: #010001">FALSE </span>) )
    {
        <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"++++++++++++++WriteBinaryBytesToFile successful.++++++++++++++" </span>&lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;
        <span style="color: blue">return </span><span style="color: #010001">TRUE</span>;
    }
    <span style="color: blue">else
    </span>{
        <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"==============WriteBinaryBytesToFile error==============." </span>&lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;
        <span style="color: blue">return </span><span style="color: #010001">FALSE</span>;
    }
}

<span style="color: blue">int </span><span style="color: #010001">_tmain</span>(<span style="color: blue">int </span><span style="color: #010001">argc</span>, <span style="color: #010001">_TCHAR</span>* <span style="color: #010001">argv</span>[])
{
    <span style="color: #010001">std</span>::<span style="color: #010001">string fileNamePath </span>= <span style="color: #a31515">"E:\\MyCPlusProject\\TestFileNameMaxLength\\TestFileNameMaxLength\\Output\\"</span>;
    <span style="color: #010001">std</span>::<span style="color: #010001">string fileNameExt </span>= <span style="color: #a31515">".txt"</span>;
    <span style="color: #010001">std</span>::<span style="color: #010001">string data</span>(<span style="color: #a31515">"This is a content."</span>);
    
    <span style="color: blue">int </span><span style="color: #010001">shortNameLength</span>;
    <span style="color: #010001">shortNameLength </span>= <span style="color: #010001">MAX_PATH </span>- <span style="color: #010001">fileNameExt</span>.<span style="color: #010001">size</span>() - <span style="color: #010001">fileNamePath</span>.<span style="color: #010001">size</span>();
    <span style="color: #010001">GCreateFile</span>(<span style="color: #010001">fileNamePath</span>, <span style="color: #010001">fileNameExt</span>, <span style="color: #010001">shortNameLength</span>, <span style="color: #010001">data</span>);

    <span style="color: #010001">std</span>::<span style="color: #010001">cout </span>&lt;&lt; <span style="color: #a31515">"------------------" </span>&lt;&lt; <span style="color: #010001">std</span>::<span style="color: #010001">endl</span>;
    <span style="color: #010001">shortNameLength </span>= <span style="color: #010001">MAX_PATH </span>- <span style="color: #010001">fileNameExt</span>.<span style="color: #010001">size</span>() - <span style="color: #010001">fileNamePath</span>.<span style="color: #010001">size</span>() - 1;
    <span style="color: #010001">GCreateFile</span>(<span style="color: #010001">fileNamePath</span>, <span style="color: #010001">fileNameExt</span>, <span style="color: #010001">shortNameLength</span>, <span style="color: #010001">data</span>);

    <span style="color: blue">return </span>0;
}</pre>
<p>提示：右键项目属性，将字符集设置为“未设置”。</p><img src ="http://www.cppblog.com/mymsdn/aggbug/125870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-09-04 13:59 <a href="http://www.cppblog.com/mymsdn/archive/2010/09/04/125870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间窗体置顶</title><link>http://www.cppblog.com/mymsdn/archive/2010/09/04/125866.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Sat, 04 Sep 2010 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/09/04/125866.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/125866.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/09/04/125866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/125866.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/125866.html</trackback:ping><description><![CDATA[<p>最近遇到一个跟Windows（不是指操作系统，而是一个::CreateWindow的结果）有关的问题。</p> <p>情况是这样的，通常的应用程序内的事件传递一般场景都是类似在窗体A上点击按钮1，弹出一个窗体B。面对这样的场景只要::SetWindowActive(HWND wnd)即可，这里其实有个隐含的前提，就是wnd的父窗口是出于TOP的状态，也就是它的父窗口是置顶的，也就是我们能够在界面上看到它，否则你的其他置顶窗口将依旧置顶。</p> <p>下面的代码示意了如何将窗口置顶，因为也没有对各个方法做深入分析，所以就不多发表言论了：</p><pre class="gc-code"><span style="color: green">/*场景：
    目标：将子窗口放到置顶（且是HWND_TOP）模式
    说明：hMainWnd是主窗口，m_pMMessageWnd-&gt;m_hWnd是子窗口
*/

/*1、将窗口从后台直接提到最前方，需要先将主窗口移上来。*/
</span><span style="color: #010001">HWND hMainWnd </span>= <span style="color: #010001">CFramework</span>::<span style="color: #010001">GetInstance</span>()-&gt;<span style="color: #010001">GetMainWnd</span>();
<span style="color: blue">if</span>( <span style="color: #010001">hMainWnd </span>!= <span style="color: #010001">NULL </span>)
{
    <span style="color: #010001">SetForegroundWindow</span>(<span style="color: #010001">hMainWnd</span>);
    <span style="color: #010001">BringWindowToTop</span>(<span style="color: #010001">hMainWnd</span>);
    <span style="color: #010001">SetActiveWindow</span>(<span style="color: #010001">hMainWnd</span>);
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">hMainWnd</span>, <span style="color: #010001">HWND_TOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
}

<span style="color: green">/*2、将子窗口置顶*/
</span><span style="color: blue">if</span>( <span style="color: #010001">m_pMMessageWnd </span>!= <span style="color: #010001">NULL </span>) <span style="color: green">/* true */
</span>{
    <span style="color: #010001">SetForegroundWindow</span>(<span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>);
    <span style="color: #010001">BringWindowToTop</span>(<span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>);
    <span style="color: #010001">SetActiveWindow</span>(<span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>);
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>, <span style="color: #010001">HWND_TOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>, <span style="color: #010001">HWND_NOTOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
}

<span style="color: green">/*3、放在后面的原因是避免子窗口还未弹出，点击窗体外的时候被放到后面去，所以等窗口出来后再取消置顶*/
</span><span style="color: blue">if</span>( <span style="color: #010001">hMainWnd </span>!= <span style="color: #010001">NULL </span>)
{
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">hMainWnd</span>, <span style="color: #010001">HWND_NOTOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
}

<span style="color: green">/*4、避免被主窗口给压了*/
</span><span style="color: blue">if</span>( <span style="color: #010001">m_pMMessageWnd </span>!= <span style="color: #010001">NULL </span>) <span style="color: green">/* true */
</span>{
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>, <span style="color: #010001">HWND_TOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
    <span style="color: #010001">SetWindowPos</span>( <span style="color: #010001">m_pMMessageWnd</span>-&gt;<span style="color: #010001">m_hWnd</span>, <span style="color: #010001">HWND_NOTOPMOST</span>, 0, 0, 0, 0, <span style="color: #010001">SWP_NOMOVE</span>|<span style="color: #010001">SWP_NOSIZE</span>|<span style="color: #010001">SWP_SHOWWINDOW </span>);
}
</pre><img src ="http://www.cppblog.com/mymsdn/aggbug/125866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-09-04 12:41 <a href="http://www.cppblog.com/mymsdn/archive/2010/09/04/125866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C/C++中动态链接库的创建和调用</title><link>http://www.cppblog.com/mymsdn/archive/2010/08/28/124983.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Fri, 27 Aug 2010 16:30:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/08/28/124983.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/124983.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/08/28/124983.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/124983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/124983.html</trackback:ping><description><![CDATA[<p>转载自：<a title="http://developer.51cto.com/art/200702/39608.htm" href="http://developer.51cto.com/art/200702/39608.htm">http://developer.51cto.com/art/200702/39608.htm</a> <p>动态连接库的创建步骤：  <p><strong>一、创建Non-MFC DLL动态链接库</strong>  <p>1、打开File —&gt; New —&gt; Project选项，选择Win32 Dynamic-Link Library —&gt;sample project —&gt;工程名：DllDemo  <p>2、新建一个.h文件DllDemo.h<pre><p>#ifdef DllDemo_EXPORTS <br>#define DllAPI __declspec(dllexport) <br>#else <br>#define DllAPI __declspec(dllimport) <br>extern "C" //原样编译 <br>{ <br>DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++语言内能够调用API <br>} <br>#endif</p></pre>
<p>3、在DllDemo.cpp文件中导入DllDemo.h文件，并实现Max(int,int)函数<pre><p>#include "DllDemo.h" <br>DllAPI int __stdcall Max(int a,int b) <br>{ <br>if(a==b) <br>return NULL; <br>else if(a&gt;b) <br>return a; <br>else <br>return b; <br>}</p></pre>
<p>4、编译程序生成动态连接库 
<p><strong>二、用.def文件创建动态连接库DllDemo.dll</strong> 
<p>1、删除DllDemo工程中的DllDemo.h文件。 
<p>2、在DllDemo.cpp文件头，删除 #include DllDemo.h语句。 
<p>3、向该工程中加入一个文本文件，命名为DllDemo.def并写入如下语句： 
<p>LIBRARY MyDll 
<p>EXPORTS 
<p>Max@1 
<p>4、编译程序生成动态连接库。 
<p><strong>动态链接的调用步骤：</strong> 
<p><strong>一、隐式调用</strong> 
<p>1、建立DllCnslTest工程 
<p>2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录 
<p>3、在DllCnslTest.h中添加如下语句：<pre><p>#define DllAPI __declspec(dllimport) <br>#pragma comment(lib，"DllDemo.lib") //在编辑器link时，链接到DllDemo.lib文件 <br>extern "C" <br>{ <br>DllAPI int __stdcall Max(int a,int b); <br>}</p></pre>
<p>4、在DllCnslTest.cpp文件中添加如下语句：<pre><p>#include "DllCnslTest.h"//或者 #include "DllDemo.h" <br>void main() <br>{ <br>int value; <br>value = Max(2,9); <br>printf("The Max value is %d\n",value); <br>}</p></pre>
<p>5、编译并生成应用程序DllCnslTest.exe 
<p><strong>二、显式调用</strong> 
<p>1、建立DllWinTest工程。 
<p>2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。 
<p>3、用vc/bin下的Dumpbin.exe的小程序，查看DLL文件(DllDemo.dll)中的函数结构。 
<p>4、使用类型定义关键字typedef，定义指向和DLL中相同的函数原型指针。 
<p>例：<pre><p>typedef int(*lpMax)(int a,int b); //此语句可以放在.h文件中</p></pre>
<p>5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。 
<p>例：<pre><p>HINSTANCE hDll; //声明一个Dll实例文件句柄 <br>hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库</p></pre>
<p>6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。 
<p>例：<pre><p>lpMax Max; <br>Max = (lpMax)GetProcAddress(hDLL,"Max"); <br>int value; <br>value = Max(2,9); <br>printf("The Max value is %d",value);</p></pre>
<p>7、函数调用完毕后，使用FreeLibrary()卸载DLL文件。<pre><p>FreeLibrary(hDll);</p></pre>
<p>8、编译并生成应用程序DllWinTest.exe 
<p>注：显式链接应用程序编译时不需要使用相应的Lib文件。</p>
<p>下载（<font style="background-color: #cccccc"></font><font color="#cccccc">Visual Studio 2008验证通过</font><font style="background-color: #cccccc"></font>）：<a title="http://www.cppblog.com/Files/mymsdn/DllCnsTest.7z" href="http://www.cppblog.com/Files/mymsdn/DllCnsTest.7z">http://www.cppblog.com/Files/mymsdn/DllCnsTest.7z</a></p><img src ="http://www.cppblog.com/mymsdn/aggbug/124983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-08-28 00:30 <a href="http://www.cppblog.com/mymsdn/archive/2010/08/28/124983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个有用的宏：&amp;ldquo;禁止类成员复制&amp;rdquo;以及&amp;ldquo;禁止隐式构造&amp;rdquo;</title><link>http://www.cppblog.com/mymsdn/archive/2010/08/11/123003.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Tue, 10 Aug 2010 16:34:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/08/11/123003.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/123003.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/08/11/123003.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/123003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/123003.html</trackback:ping><description><![CDATA[<p>禁止类成员复制，其核心就在于不允许类外部看见复制函数，包括&#8220;拷贝构造函数&#8221;、&#8220;operator =重载&#8221;。</p>
<pre class="gc-code">#define DISALLOW_COPY_AND_ASSIGN(TypeName) \<br><span style="color: #0000ff;">private</span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>TypeName(<span style="color: #0000ff;">const</span> TypeName&amp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>TypeName&amp; <span style="color: #0000ff;">operator</span>=(<span style="color: #0000ff;">const</span> TypeName&amp;)</pre>
禁止隐式构造，则可以将默认构造函数隐藏起来，在大多数编译器中也可以对构造函数增加explicit关键字来避免隐式构造。
<pre class="gc-code">#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \<br><span style="color: #0000ff;">private</span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>TypeName();&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; \<br>DISALLOW_COPY_AND_ASSIGN(TypeName)</pre>
更多解释详见《More Effective C++》  <img src ="http://www.cppblog.com/mymsdn/aggbug/123003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-08-11 00:34 <a href="http://www.cppblog.com/mymsdn/archive/2010/08/11/123003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[C++]__declspec关键字</title><link>http://www.cppblog.com/mymsdn/archive/2010/07/22/121059.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Thu, 22 Jul 2010 12:46:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/07/22/121059.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/121059.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/07/22/121059.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/121059.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/121059.html</trackback:ping><description><![CDATA[<p><span style="color: blue">__declspec</span>关键字</p><pre class="gc-code"><span style="color: green">// keyword__declspec.cpp : 定义控制台应用程序的入口点。
//

// ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/kernel_d/hh/Kernel_d/64bitAMD_6db3322a-fe6d-4287-9eda-a9c1378e715d.xml.htm
// The sizeof value for any structure is the offset of the final member, 
//  plus that member's size, rounded up to the nearest multiple of the largest 
//  member alignment value or the whole structure alignment value, 
//  whichever is greater. 

</span><span style="color: blue">#include </span><span style="color: #a31515">"stdafx.h"

</span><span style="color: blue">__declspec</span>( <span style="color: blue">align</span>( 32) ) <span style="color: blue">struct </span><span style="color: #010001">Struct__declspec_1
</span>{
    <span style="color: blue">int </span><span style="color: #010001">a</span>;
    <span style="color: blue">int </span><span style="color: #010001">b</span>;
};

<span style="color: blue">__declspec</span>( <span style="color: blue">align</span>( 32) ) <span style="color: blue">struct </span><span style="color: #010001">Struct__declspec_2
</span>{
    <span style="color: blue">__declspec</span>( <span style="color: blue">align</span>( 64) ) <span style="color: blue">int </span><span style="color: #010001">a</span>;
    <span style="color: blue">int </span><span style="color: #010001">b</span>;
};

<span style="color: blue">__declspec</span>( <span style="color: blue">align</span>( 8 ) ) <span style="color: blue">struct </span><span style="color: #010001">Struct__declspec_3
</span>{
    <span style="color: blue">int </span><span style="color: #010001">a</span>;  <span style="color: green">//4 bytes
    </span><span style="color: blue">int </span><span style="color: #010001">b</span>;  <span style="color: green">//4 bytes
    </span><span style="color: blue">int </span><span style="color: #010001">c</span>;  <span style="color: green">//4 bytes
</span>};

<span style="color: blue">__declspec</span>( <span style="color: blue">align</span>( 8 ) ) <span style="color: blue">struct </span><span style="color: #010001">Struct__declspec_4
</span>{
    <span style="color: blue">int </span><span style="color: #010001">a</span>;  <span style="color: green">//4 bytes
    </span><span style="color: blue">int </span><span style="color: #010001">b</span>;  <span style="color: green">//4 bytes
</span>};

<span style="color: blue">struct </span><span style="color: #010001">StructNormal
</span>{
    <span style="color: blue">int </span><span style="color: #010001">a</span>;  <span style="color: green">//4 bytes
    </span><span style="color: blue">int </span><span style="color: #010001">b</span>;  <span style="color: green">//4 bytes
    </span><span style="color: blue">int </span><span style="color: #010001">c</span>;  <span style="color: green">//4 bytes
</span>};

<span style="color: blue">int </span><span style="color: #010001">_tmain</span>(<span style="color: blue">int </span><span style="color: #010001">argc</span>, <span style="color: #010001">_TCHAR</span>* <span style="color: #010001">argv</span>[])
{
    <span style="color: #010001">printf</span>( <span style="color: #a31515">"sizeof Struct__declspec_1 is %d.\n"</span>, <span style="color: blue">sizeof</span>( <span style="color: #010001">Struct__declspec_1 </span>));    <span style="color: green">//32
    </span><span style="color: #010001">printf</span>( <span style="color: #a31515">"sizeof Struct__declspec_2 is %d.\n"</span>, <span style="color: blue">sizeof</span>( <span style="color: #010001">Struct__declspec_2 </span>));    <span style="color: green">//64
    </span><span style="color: #010001">printf</span>( <span style="color: #a31515">"sizeof Struct__declspec_3 is %d.\n"</span>, <span style="color: blue">sizeof</span>( <span style="color: #010001">Struct__declspec_3 </span>));    <span style="color: green">//16
    </span><span style="color: #010001">printf</span>( <span style="color: #a31515">"sizeof Struct__declspec_4 is %d.\n"</span>, <span style="color: blue">sizeof</span>( <span style="color: #010001">Struct__declspec_4 </span>));    <span style="color: green">//8

    </span><span style="color: #010001">printf</span>( <span style="color: #a31515">"sizeof StructNormal is %d.\n"</span>, <span style="color: blue">sizeof</span>( <span style="color: #010001">StructNormal </span>));    <span style="color: green">//12
    </span><span style="color: blue">return </span>0;
}

</pre><img src ="http://www.cppblog.com/mymsdn/aggbug/121059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-07-22 20:46 <a href="http://www.cppblog.com/mymsdn/archive/2010/07/22/121059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[C++]内存管理（1）</title><link>http://www.cppblog.com/mymsdn/archive/2010/07/06/memory_manager-1.html</link><dc:creator>volnet</dc:creator><author>volnet</author><pubDate>Tue, 06 Jul 2010 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/mymsdn/archive/2010/07/06/memory_manager-1.html</guid><wfw:comment>http://www.cppblog.com/mymsdn/comments/119492.html</wfw:comment><comments>http://www.cppblog.com/mymsdn/archive/2010/07/06/memory_manager-1.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cppblog.com/mymsdn/comments/commentRss/119492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mymsdn/services/trackbacks/119492.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 和大多数内存管理的初衷一致，希望能够控制内存分配和回收，减少内存碎片，且通常这样的内存都会预开一段连续内存空间，然后我们自己来管理这段内存。当然通常这样的需求都很合理，但是实现起来则通常不能完美，比如：效率、算法的选择、如何减少内存碎片、跟踪管理内存分配、性能检测、对系统内存使用的统计、垃圾回收等。下面是我近期实现的一个非常简陋的程序，甚至可能连基本的要求都无法达到，大家帮忙看看，它究竟有多少缺点...&nbsp;&nbsp;<a href='http://www.cppblog.com/mymsdn/archive/2010/07/06/memory_manager-1.html'>阅读全文</a><img src ="http://www.cppblog.com/mymsdn/aggbug/119492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mymsdn/" target="_blank">volnet</a> 2010-07-06 22:45 <a href="http://www.cppblog.com/mymsdn/archive/2010/07/06/memory_manager-1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>