﻿<?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++博客-Life is Good.-随笔分类-C/C++</title><link>http://www.cppblog.com/85940806/category/17028.html</link><description>Enhance Tech and English</description><language>zh-cn</language><lastBuildDate>Sat, 10 Sep 2011 04:21:12 GMT</lastBuildDate><pubDate>Sat, 10 Sep 2011 04:21:12 GMT</pubDate><ttl>60</ttl><item><title>mutable</title><link>http://www.cppblog.com/85940806/archive/2011/06/23/149239.html</link><dc:creator>Mike Song</dc:creator><author>Mike Song</author><pubDate>Thu, 23 Jun 2011 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/85940806/archive/2011/06/23/149239.html</guid><wfw:comment>http://www.cppblog.com/85940806/comments/149239.html</wfw:comment><comments>http://www.cppblog.com/85940806/archive/2011/06/23/149239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/85940806/comments/commentRss/149239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/85940806/services/trackbacks/149239.html</trackback:ping><description><![CDATA[<div><div>mutable英音：'mju:təbl美音：'mjutəb!，形容词，意为易变的;反复无常的。在C++语言中，是命令语言&#8212;&#8212;如果一个函数被const 修饰，那么它将无法修改其成员变量的，但是如果这个成员变量是被mutable修饰的话，则可以修改。</div><br /><div>mutable 可以用来指出，即使结构或者类变量为const，其某个成员也可以被修改。 </div><br /><div>在c++的类中， 如果一个函数被const 修饰，那么它将无法修改其成员变量的，但是如果这个成员变量是被mutable修饰的话，则可以修改。</div><br /><div>例如:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;data<br />　　{<br />　　</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;name[</span><span style="color: #000000; ">30</span><span style="color: #000000; ">];<br />　　mutable&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000;">&nbsp;accesses;<br />　　<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />.<br />　　};<br />　　</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;data&nbsp;veep&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">david</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,}<br />　　strcpy(veep.name,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Jimmy</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;not&nbsp;allowed</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">　　veep.accesses</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;allowed <br /></span></div><br /><div>　veep 的const限定符禁止程序修改veep的成员，但access成员的mutable说明符表示access不受这种限制。</div><br /> </div></div><img src ="http://www.cppblog.com/85940806/aggbug/149239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/85940806/" target="_blank">Mike Song</a> 2011-06-23 10:39 <a href="http://www.cppblog.com/85940806/archive/2011/06/23/149239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++sizeof使用规则及陷阱分析</title><link>http://www.cppblog.com/85940806/archive/2010/10/26/131404.html</link><dc:creator>Mike Song</dc:creator><author>Mike Song</author><pubDate>Tue, 26 Oct 2010 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/85940806/archive/2010/10/26/131404.html</guid><wfw:comment>http://www.cppblog.com/85940806/comments/131404.html</wfw:comment><comments>http://www.cppblog.com/85940806/archive/2010/10/26/131404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/85940806/comments/commentRss/131404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/85940806/services/trackbacks/131404.html</trackback:ping><description><![CDATA[<p>sizeof()返回的是<span style="color: red;">变量声明后所占的内存数</span>，不是实际长度，此外sizeof不是函数，仅仅是一个操作符.</p>
<p>cout&lt;&lt;sizeof(int)&lt;&lt;endl; // 32位机上int长度为4</p>
<p>cout&lt;&lt;sizeof(1==2)&lt;&lt;endl; // == 操作符返回bool类型，相当于 cout&lt;&lt;sizeof(bool)&lt;&lt;endl;</p>
<p>这里有个陷阱，看下面的程序：</p>
<p>　　 int a = 0;</p>
<p>　　cout&lt;&lt;sizeof(a=3)&lt;&lt;endl;</p>
<p>　　 cout&lt;&lt;a&lt;&lt;endl;</p>
<p>　　输出为什么是4，0而不是期望中的4，3？？？就<strong>在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码，所以sizeof作用范围内，也就是()里面的内容也不能被编译，而是被替换成类型</strong>。=操作符返回左操作数的类型，所以a=3相当于int，而代码也被替换为：</p>
<p>　　int a = 0;</p>
<p>　　cout&lt;&lt;4&lt;&lt;endl;</p>
<p>　　cout&lt;&lt;a&lt;&lt;endl;</p>
<p>数组问题</p>
<p>　　考虑下面问题：</p>
<p>　　char a[] = "abcdef";</p>
<p>　　char b[] = {'a', 'b', 'c', 'd', 'e', 'f'};</p>
<p>　　int c[20] = {3, 4};</p>
<p>　　 <strong>char d[2][3] = {"aa", "bb"};</strong></p>
<p>　　 cout&lt;&lt;sizeof(a)&lt;&lt;endl; // 7, 表示字符串</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;cout&lt;&lt;sizeof(b)&lt;&lt;endl; // 6， 仅表示字符数组</p>
<p>　　 cout&lt;&lt;sizeof(c)&lt;&lt;endl; // 80</p>
<p>　　<strong>cout&lt;&lt;sizeof(d)&lt;&lt;endl; // 6</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; sizeof(*a) &lt;&lt; endl;//1</p>
<p>　　 cout &lt;&lt; sizeof(*b) &lt;&lt; endl;//1</p>
<p>　　 cout &lt;&lt; sizeof(*c) &lt;&lt; endl;//4</p>
<p><strong>　　 &nbsp;cout &lt;&lt; sizeof(*d) &lt;&lt; endl;//3</strong></p>
<p><strong>结论：特别如果字符数组表示字符串的话，数组末自动插入的'\0'，在sizeof时不能遗漏，</strong><strong>数组a的大小在定义时未指定，编译时给它分配的空间是按照初始化的值确定的，也就是。c是多维数组，<u>占用的空间大小是各维数的乘积</u>，也就是6。可以看出，<u>数组的大小就是他在编译时被分配的空间，也就是各维数的乘积*数组元素的大小。</u></strong></p>
<p><br /><strong></strong></p>
<p><strong><u>再分析下面的多维数组问题：</u></strong></p>
<p>　　double* (*a)[3][6];</p>
<p>　　 cout&lt;&lt;sizeof(a)&lt;&lt;endl; // 4</p>
<p>　　cout&lt;&lt;sizeof(*a)&lt;&lt;endl; // 72</p>
<p>　　 cout&lt;&lt;sizeof(**a)&lt;&lt;endl; // 24</p>
<p>　　 cout&lt;&lt;sizeof(***a)&lt;&lt;endl; // 4</p>
<p>　　cout&lt;&lt;sizeof(****a)&lt;&lt;endl; // 8</p>
<p>　　<strong>（一）不考虑继承关系（单继承、多继承、虚继承等）</strong></p>
<p>　　（1）不带virtual函数时</p>
<p>　　空类：</p>
<p>　　class A</p>
<p>　　{&nbsp;};</p>
<p>　　cout &lt;&lt; sizeof(A) &lt;&lt; endl; // 1</p>
<p>　　空类总是返回1</p>
<p>　　class B {</p>
<p>　　private :</p>
<p>　　int value;</p>
<p>　　double a;</p>
<p>　　public:};</p>
<p>　　cout &lt;&lt; sizeof(B) &lt;&lt; endl; //16</p>
<p>　　<strong>和struct一样，也要考虑对齐问题，以及成员的顺序因为成员函数不会分配空间，所以sizeof时只计算数据成员的大小</strong></p>
<p>　　<strong>（2）带virtual函数时</strong></p>
<p>　　单继承情况下，只要class中存在virtual函数，<strong>编译器在编译时就会自动插入一个指向虚函数表的指针vptr(大小为4字节). </strong>不同的编译器vptr插入的位置可能不同，VC编译器插入vptr的位置一般是数据成员开始。</p>
<p>　　下例在MinGW Develper Studio2.05(gcc)下编译，<span style="background-color: yellow;">VC 6.0编译器下结果为24&nbsp; 24， </span>我不太理解为什么...</p>
<p>　　 class A</p>
<p>　　 {</p>
<p>　　 public:</p>
<p>　　 virtual void foo() {}</p>
<p>　　 private:</p>
<p>　　 int m1;</p>
<p>　　 double m2;</p>
<p>　　 };</p>
<p>　　class B</p>
<p>　　 {</p>
<p>　　 public:</p>
<p>　　virtual void foo() {}</p>
<p>　　 private:</p>
<p>　　 double m2;</p>
<p>　　 int m1;</p>
<p>　　 };</p>
<p>　　cout &lt;&lt; sizeof(A) &lt;&lt; endl; // <span style="background-color: yellow;">24</span></p>
<p>　　 cout &lt;&lt; sizeof(B) &lt;&lt; endl; // <span style="background-color: yellow;">24</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产生上面的不同时数据对其的原因。</p>
<p><strong>（3）带static成员时</strong></p>
<p>　　 class A {</p>
<p>　　private :</p>
<p>　　int value;</p>
<p>　　double a;</p>
<p>　　static int CST;</p>
<p>　　public:</p>
<p>　　 };</p>
<p>　　cout &lt;&lt; sizeof(A) &lt;&lt; endl; //16</p>
<p>　　<strong>因为static成员是分配在全局区为类的所有对象共享</strong>（VC编译器可能为了方便将其放入文字常量表), <strong>sizeof时不应该计入static成员</strong></p><img src ="http://www.cppblog.com/85940806/aggbug/131404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/85940806/" target="_blank">Mike Song</a> 2010-10-26 21:53 <a href="http://www.cppblog.com/85940806/archive/2010/10/26/131404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>