??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲精品久,亚洲国产成人精品女人,日韩成人精品http://www.aygfsteel.com/majianan/category/13114.html<br> <div align=center > <img width=200 height=50 src="http://www.aygfsteel.com/images/blogjava_net/majianan/14891/r_5858488902000cu2.gif" name="welcome"> </div> <br> <script language="JavaScript"> <!-- Begin text = "人本是hQ不必刻意去做hQ世本是世,无须_ֿd世;自然的才是快乐的?; color1 = "blue"; color2 = "red"; fontsize = "2"; speed = 100; i = 0; if (navigator.appName == "Netscape") { document.write("<layer id=a visibility=show></layer><br><br><br>"); } else { document.write("<div id=a></div>"); } function changeCharColor() { if (navigator.appName == "Netscape") { document.a.document.write("<center><font face=arial size =" + fontsize + "><font color=" + color1 + ">"); for (var j = 0; j < text.length; j++) { if(j == i) { document.a.document.write("<font face=arial color=" + color2 + ">" + Text.charAt(i) + "</font>"); } else { document.a.document.write(text.charAt(j)); } } document.a.document.write('</font></font></center>'); document.a.document.close(); } if (navigator.appName == "Microsoft Internet Explorer") { str = "<center><font face=arial size=" + fontsize + "><font color=" + color1 + ">"; for (var j = 0; j < text.length; j++) { if( j == i) { str += "<font face=arial color=" + color2 + ">" + text.charAt(i) + "</font>"; } else { str += text.charAt(j); } } str += "</font></font></center>"; a.innerHTML = str; } (i == text.length) ? i=0 : i++; } setInterval("changeCharColor()", speed); // End --> </script> zh-cnWed, 28 Feb 2007 12:07:24 GMTWed, 28 Feb 2007 12:07:24 GMT60[ 学习W记 ] Effective C++ QItem 1http://www.aygfsteel.com/majianan/archive/2006/08/21/64761.html马嘉?/dc:creator>马嘉?/author>Mon, 21 Aug 2006 04:56:00 GMThttp://www.aygfsteel.com/majianan/archive/2006/08/21/64761.htmlhttp://www.aygfsteel.com/majianan/comments/64761.htmlhttp://www.aygfsteel.com/majianan/archive/2006/08/21/64761.html#Feedback0http://www.aygfsteel.com/majianan/comments/commentRss/64761.htmlhttp://www.aygfsteel.com/majianan/services/trackbacks/64761.html Item 1QView C++ as a federation of languages
 
Item 1Q将C++视ؓ语言的联合体
 
------------------- Chinese -------------------
 
最初,C++仅仅是在C的基上附加了一些面向对象的特征。但是,随着C++的成长发展,C++已经成ؓ了一个多范式的编E语aQ一个囊括了q程化,面向对象Q函数化Q泛型以及元~程Ҏ的联合体。可以将它分?个部分:
 
C ------ 归根l底QC++依然是基于C的。模块,语句Q预处理器,内徏数据cdQ数l,指针{,全都来自于C。只是在很多斚wQC++提出了更高的解决问题的Ҏ?/font>
 
Object-Oriented C++ ------ C++的这部分是C with Classes 涉及到的全部Q类Q包括构造函数和析构函数Q,装Q承,多态,虚函敎ͼ动态邦定){。C++的这一部分直接适用于面向对象设计的l典规则?/font>
 
Template C++ ------ q是C++的泛型编E部分?/font>
 
STL ------ STL是一个特D的模板库。它容器,q代器,法和函数对象优雅的整合在一赗?/font>
     
头脑中保持这四个子语aQ从一U子语言转到另一U时Qؓ了高效编E,需要改变策略:
 
      例如Q适用内徏Q类C的)cdӞ传值通常比传引用更高效,但是当从C++的C部分转到C++的Object-Oriented部分Q用戯定义构造函数和析构函数意味着更好的做法是引用传递给const参数。在 Template C++ 中工作时Q这一Ҏ加重要,因ؓQ在q种情况下,你甚至不知道你的操作涉及到的对象的类型。当你进?STLQ无论如何,你知道P代器和函数对象以 C 的指针ؓ原型Q对?STL 中的q代器和函数对象Q古老的 C 中的传D则又重新生效?/font>
 
***********************************************************
 
Things to RememberQ?/strong>
 
      高效C++~程规则的变化,依赖于你使用C++的哪一个部分?/font>
 
 
 
 
 
------------------- English --------------------
 
In the beginning, C++ was just C with some object-oriented features tacked on. As the language matured, C++ have become a multiparadigm programming language, one suppoting a combination of procedural, object-oriented, functional, generic, and metaprogramming features.
 
There are four parts in the C++:
 
C ------ Way down deep, C++ is still based on C. Blocks, statements, the preprocessor, built-in data types, arrays, pointers,etc, all come from C. In many cases, C++ just offers approaches to problems that are superior to their C counterparts.
 
Object-Oriented C++ ------ This part of C++ is what C with Classes was all about: classes(including constructors and destructors), encapsulation, inheritance, polymorphism, virtual functions(dynamic binding),etc. This is the part of C++ to which the classic rules for object-oriented design most directly apply.
 
Template C++ ------ This is the generic programming part of C++.
 
The STL ------ The STL si avery special template library. Its conventions regarding containers, iterators, algorithms, and function objects mesh beautifully.
 
Keep these four sublanguages in mind, and don't be surprised when you encounter situations where effective programming requires that you change strategy when you switch from one sublanguage to another.
 
For example, pass-by-value is generally more efficient than pass-by-reference for built-in (i.e., C-like) types, but when you move from the C part of C++ to Object-Oriented C++, the existence of user-defined constructors and destructors means that pass-by-reference-to-const is usually better. This is especially the case when working in Template C++, because there, you don't even know the type of object you're dealing with. When you cross into the STL, however, you know that iterators and function objects are modeled on pointers in C, so for iterators and function objects in the STL, the old C pass-by-value rule applies again.  
 
**********************************************************
 
Things to Remember
 
Rules for effective C++ programming vary, depending on the part of C++ you are using!


]]>
iostream ?iostream.h 的区?/title><link>http://www.aygfsteel.com/majianan/archive/2006/08/21/64759.html</link><dc:creator>马嘉?/dc:creator><author>马嘉?/author><pubDate>Mon, 21 Aug 2006 04:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/majianan/archive/2006/08/21/64759.html</guid><wfw:comment>http://www.aygfsteel.com/majianan/comments/64759.html</wfw:comment><comments>http://www.aygfsteel.com/majianan/archive/2006/08/21/64759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/majianan/comments/commentRss/64759.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/majianan/services/trackbacks/64759.html</trackback:ping><description><![CDATA[ <div align="left"> <font size="4">转自Q?/font> <a > <font size="4">http://blog.sina.com.cn/m/majianan</font> </a> <font size="4">(我的新浪Blog)<br />前一D|间在自学C++Q现在工作了用JavaQ不q以前写的一些文章自我感觉还不错Q哈哈,p{来这里,大家多提意见?br />蛮喜Ƣ这个Blog?br /><br /><br />                                         <font color="#0000ff"> < iostream > ?< iostream.h > 的区?/font><br /><br />关键词:< iostream > ?< iostream.h ></font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">你写E序的时候,?lt; iostream >q是< iostream.h >Q?/font> </div> <div> <font size="4">你知道它们有什么区别么Q还是认Z们根本就是一LQ?/font> </div> <div> <font size="4">下面听我l你吹(文中U属个ha论,不涉及国家机密,h心阅读,若{载请注明出处作者^-^Q?/font> </div> <div> <font size="4">                              ---majianan</font> </div> <div> <font size="4"> </font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">其实没有< iostream.h >q样的东?--- 标准化委员会在简化非C标准头文件时?lt; iostream > 取代了它。但又没有完全取?lt; iostream.h >的用,q且很多~译器都同时支持< iostream >?lt; iostream.h >Q造成现在的局面,老大Q标准化委员会)实有不得已的苦街?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">话说当年Q在标准化委员会动手重徏新的标准库的时候,遇到了问题。ؓ了避免类名函数名的冲H问题,引入了名字空间stdQ但无数现有的C++代码都依赖于使用了多q的伪标准库中的功能Q例如,声明?lt; iostream.h >?lt; complex.h >{头文g中的功能。现有Y件没有针对用名字空间而进行相应的设计或者升U,如果用std来包装标准库D现有代码不能使用Q那手底下的弟Q程序员Q是不会同意的?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">标准化委员会Z拉拢人心Q吸引更多的人入会,军_为包装了std的那部分标准库构建新的头文g名。将现有C++头文件名中的.hLQ所以就出现?lt; iostream.h>?lt; iostream >{很多双胞胎。对于C头文Ӟ采用同样Ҏ但在每个名字前还要添加一个CQ所以C?lt;string.h>变成?lt;cstring>?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">旧的C++头文件是官方明确反对使用的,但旧的C头文件则没有Q以保持对C的兼Ҏ)。其实编译器刉商不会停止对客L有Y件提供支持,所以在可以预计的将来,旧的C++头文件还会嚣张一D|间?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">如果能明白字W串头文件的使用QD一反三Q其他的也差不多会用了?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4"><string.h>是旧的C头文Ӟ对应的是Zchar*的字W串处理函数Q?/font> </div> <div> <font size="4"><string>是包装了std的C++头文Ӟ对应的是新的strngc;</font> </div> <div> <font size="4"><cstring>是对应旧的C头文件的std版本?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">好像跑远了,a归正传。如果你的编译器都同时支?lt; iostream >?lt; iostream.h >Q那使用#include < iostream >Q得到的是置于名字空间std下的iostream库的元素Q如果?include < iostream.h >Q得到的是置于全局I间的同L元素。在全局I间获取元素会导致名字冲H,而设计名字空间的初衷正是用来避免q种名字冲突的发生。还有,打字?lt; iostream >?lt; iostream.h >两个字Q所以我会?lt; iostream > ^-^</font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">CQ睡了?/font> </div> <div> <font size="4"> </font> </div> <div> <font size="4"> </font> </div> <div> <font size="4">                                      马嘉?/font> </div> <div> <font size="4">                                  2005-12-26 午夜</font> </div> <img src ="http://www.aygfsteel.com/majianan/aggbug/64759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/majianan/" target="_blank">马嘉?/a> 2006-08-21 12:50 <a href="http://www.aygfsteel.com/majianan/archive/2006/08/21/64759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 sizeof() 的一些思?/title><link>http://www.aygfsteel.com/majianan/archive/2006/08/20/64664.html</link><dc:creator>马嘉?/dc:creator><author>马嘉?/author><pubDate>Sun, 20 Aug 2006 13:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/majianan/archive/2006/08/20/64664.html</guid><wfw:comment>http://www.aygfsteel.com/majianan/comments/64664.html</wfw:comment><comments>http://www.aygfsteel.com/majianan/archive/2006/08/20/64664.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/majianan/comments/commentRss/64664.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/majianan/services/trackbacks/64664.html</trackback:ping><description><![CDATA[ <div> <p> <font size="2"> <font face="Verdana"> <font color="#000000"> <font color="#0000ff" size="3">                                        关于 sizeof() 的一些思?/font> <br /> <br /> <br />关键词:sizeof</font> </font> </font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#000000">q是|上的一个帖子,最初来自那里已l记不得了,不过我觉得很不错?/font> </font> </font> </p> <p> <font face="Verdana" size="2">我对原文做了一些修改,q添加了一些内宏V如果有什么错误的地方Q请大家指正Q谢谢~~ </font> </p> <p> <font face="Verdana" size="2">                       --- majianan 2005-12-19 </font> </p> <p> <strong> <font face="Verdana" color="#0000ff" size="2"> </font> </strong> </p> <p> <font size="2"> <font face="Verdana"> <strong> <font color="#0000ff">0.关键?/font> </strong>QsizeofQ字节对齐,cd大小 </font> </font> </p> <p> <font size="2"> <font face="Verdana"> <strong> <font color="#0000ff">前向声明Q?/font> </strong> <br />    sizeofQ一个其貌不扬的家伙Q引无数菜鸟竟折? </font> </font> </p> <p> <font face="Verdana" size="2">    虾我当初也没少犯迷p,U着“辛苦我一个,q福千万人”的伟大思想,我决定将其尽可能详细的ȝ一下?</font> </p> <p> <br /> <font face="Verdana" size="2">    但当我ȝ的时候才发现Q这个问题既可以单,又可以复杂。所以本文有的地方ƈ不适合初学者,甚至都没有必要大作文章。但如果你想“知其然Q更知其所以然”的话,那么q篇文章对你或许有所帮助?br />    </font> </p> <p> <font face="Verdana" size="2">    菜鸟我对C++的掌握尚未深入,其中不乏错误Q欢q各位指正啊 </font> </p> <p> <font size="2"> <font face="Verdana"> <strong> <font color="#0000ff">1. 定义Q?br /></font> </strong>    sizeof是何方神圣? </font> </font> </p> <p> <font face="Verdana" size="2">    sizeof ?C/C++ 中的一个操作符QoperatorQ是也。简单说其作用就是返回一个对象或者类型所占的内存字节数?br /><br />MSDN上的解释为: </font> </p> <p> <font face="Verdana" size="2">The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types).This keyword returns a value of type size_t. </font> </p> <p> <font face="Verdana" size="2">    其返回值类型ؓsize_tQ在头文件stddef.h中定义。这是一个依赖于~译pȝ的|一般定义ؓ </font> </p> <p> <font face="Verdana" size="2">typedef unsigned int size_t; </font> </p> <p> <font face="Verdana" size="2">    世上~译器林林L,但作Z个规范,它们都会保证char、signed char和unsigned char的sizeofgؓ1Q毕竟char是我们编E能用的最数据类型?br /><br /><strong><font color="#0000ff">2. 语法Q?/font></strong><br />    sizeof有三U语法Ş式,如下Q?br />    1) sizeof( object );    // sizeof( 对象 );<br />    2) sizeof( type_name ); // sizeof( cd );<br />    3) sizeof object;       // sizeof 对象; </font> </p> <p> <font face="Verdana" size="2">所以,<br />int i;<br />sizeof( i );     // ok<br />sizeof i;        // ok<br />sizeof( int );   // ok<br />sizeof int;      // error </font> </p> <p> <font face="Verdana" size="2">既然写法2可以用写?代替Qؓ求Ş式统一以及减少我们大脑的负担,W?U写法,忘掉它吧Q?</font> </p> <p> <font face="Verdana" size="2">实际上,sizeof计算对象的大也是{换成对对象类型的计算。也是_同种cd的不同对象其sizeof值都是一致的?</font> </p> <p> <font face="Verdana" size="2">q里Q对象可以进一步g伸至表达式,即sizeof可以对一个表辑ּ求倹{编译器<strong>Ҏ表达式的最l结果类型来定大小</strong>Q一般不会对表达式进行计?</font> </p> <p> <font face="Verdana" size="2">例如Q?</font> </p> <p> <font face="Verdana" size="2">sizeof( 2 );        // 2的类型ؓintQ所以等价于 sizeof( int );<br />sizeof( 2 + 3.14 ); // 3.14的类型ؓdoubleQ?也会被提升成doublecdQ所以等价于 sizeof( double );<br /><br />    sizeof也可以对一个函数调用求|?font color="#0000ff">l果是函数返回类型的大小Q函数ƈ不会被调用?/font>我们来看一个完整的例子Q?</font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">char foo()<br />{<br />    printf("foo() has been called.\n");<br />    return 'a';<br />}<br />int main()<br />{<br />    size_t sz = sizeof( foo() );   // foo() 的返回值类型ؓcharQ所以sz = sizeof(char)Q但函数foo()q不会被调用<br />    printf("sizeof( foo() ) = %d\n", sz);<br />} </font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">C99标准规定Q函数、不能确定类型的表达式以及位域(bit-fieldQ成员不能被计算sizeof|即下面这些写法都是错误的Q?</font> </p> <p> <font face="Verdana" size="2">    sizeof( foo );     // error<br />    void foo2() { }<br />    sizeof( foo2() );  // error<br />    struct S<br />    {<br />        unsigned int f1 : 1;<br />        unsigned int f2 : 5;<br />        unsigned int f3 : 12;<br />    };<br />    sizeof( S.f1 );   // error </font> </p> <p> <br /> <strong> <font size="2"> <font face="Verdana"> <font color="#0000ff">3. sizeof的常量?/font> </font> </font> </strong> </p> <strong> <font color="#0000ff"> </font> </strong> <p> <br /> <font face="Verdana" size="2">    sizeof的计发生在~译时刻Q所以它可以被当作常量表辑ּ使用。如Q?</font> </p> <p> <font face="Verdana" size="2">char ary[ sizeof( int ) * 10 ];   // ok </font> </p> <p> <font face="Verdana" size="2">最新的C99标准规定sizeof也可以在q行时刻q行计算。如下面的程序在Dev-C++中可以正执行: </font> </p> <p> <font face="Verdana" size="2">int n;<br />n = 10;        // n动态赋?br />char ary[n];   // C99也支持数l的动态定?br />printf("%d\n", sizeof(ary)); // ok. 输出10 </font> </p> <p> <font face="Verdana" size="2">但在没有完全实现C99标准的编译器中就行不通了Q上面的代码在VC6中就通不q编译。所以我?font color="#0000ff">最好还是认为sizeof是在~译期执行的</font>Q这样不会带来错误,让程序的可移植性强些?</font> </p> <p> <br /> <strong> <font size="2"> <font face="Verdana"> <font color="#0000ff">4. 基本数据cd的sizeof</font> </font> </font> </strong> </p> <p> <font face="Verdana" size="2">q里的基本数据类型指short、int、long、float、doubleq样的简单内|数据类型。由于它们都是和pȝ相关的,所以在不同的系l下取值可能不同。这务必引v我们的注意,量不要在这斚wl自q序的UL造成ȝ?</font> </p> <p> <font face="Verdana" size="2">一般的Q在32位编译环境中Qsizeof(int)的取gؓ4?</font> </p> <p> <br /> <strong> <font size="2"> <font face="Verdana"> <font color="#0000ff">5. 指针变量的sizeof</font> </font> </font> </strong> </p> <p> <font face="Verdana" size="2">学过数据l构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址?font color="#0000ff">既然是来存放地址的,那么它当然等于计机内部地址ȝ的宽度?/font>所以在32位计机中,一个指针变量的q回值必定是4Q注意结果是以字节ؓ单位Q。可以预计,在将来的64位系l中指针变量的sizeofl果??</font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">char* pc = "abc";<br />int* pi;<br />string* ps;<br />char** ppc = &pc;<br />void (*pf)(); // 函数指针<br />sizeof( pc ); // l果?<br />sizeof( pi ); // l果?<br />sizeof( ps ); // l果?<br />sizeof( ppc );// l果?<br />sizeof( pf ); // l果? </font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">指针变量的sizeofg指针所指的对象没有M关系Q正是由于所有的指针变量所占内存大相{,所以MFC消息处理函数使用两个参数WPARAM、LPARAMp传递各U复杂的消息l构Q用指向结构体的指针)?</font> </p> <p> <br /> <strong> <font size="2"> <font face="Verdana"> <font color="#0000ff">6. 数组的sizeof</font> </font> </font> </strong> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">数组的sizeof值等于数l所占用的内存字节数</font>Q如Q?</font> </font> </p> <p> <font face="Verdana" size="2">char a1[] = "abc";<br />int a2[3];<br />sizeof( a1 ); // l果?Q字W?末尾q存在一个NULLl止W?br />sizeof( a2 ); // l果?*4=12Q依赖于intQ?</font> </p> <p> <font face="Verdana" size="2">一些朋友刚开始时把sizeof当作了求数组元素的个敎ͼ现在Q你应该知道q是不对的。那么应该怎么求数l元素的个数呢? </font> </p> <p> <font face="Verdana" size="2">EasyQ通常有下面两U写法: </font> </p> <p> <font face="Verdana" size="2">int c1 = sizeof( a1 ) / sizeof( char );    // 总长?单个元素的长?br />int c2 = sizeof( a1 ) / sizeof( a1[0]);    // 总长?W一个元素的长度 </font> </p> <p> <br /> <font face="Verdana" size="2">写到q里Q提一问,下面的c3Qc4值应该是多少呢? </font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">void foo3(char a3[3])<br />{<br />    int c3 = sizeof( a3 ); // c3 ==<br />}<br />void foo4(char a4[])<br />{<br />    int c4 = sizeof( a4 ); // c4 ==<br />} </font> </p> <p> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************</font> </font> </font> </p> <p> <font face="Verdana" size="2">也许当你试图回答c4的值时已经意识到c3{错了,是的Qc3!=3?</font> </p> <p> <font face="Verdana" size="2">q里函数参数<font color="#0000ff">a3已不再是数组cdQ而是蜕变成指针?/font>相当于char* a3Qؓ什么仔l想惛_不难明白?</font> </p> <p> <font face="Verdana" size="2">我们调用函数foo1ӞE序会在栈上分配一个大ؓ3的数l吗Q不会! </font> </p> <p> <font face="Verdana" size="2">数组是“传址”的Q调用者只需实参的地址传递过去,所以a3自然为指针类型(char*Q,c3的g׃ؓ4?</font> </p> <p> <br /> <font size="2"> <font face="Verdana"> <strong> <font color="#0000ff">7.string的sizeof</font> </strong> <br /> <font color="#0000ff">一个string的大与它所指向的字W串的长度无?/font>?br /><br /><font color="#0000ff">*********************************************************</font><br />string st1("blog.sina.com.cn");<br />string st2("majianan");<br />string st3;<br />string *ps = &st1;<br />cout << "st1: " << sizeof(st1) << endl;<br />cout << "st2: " << sizeof(st2) << endl;<br />cout << "st3: " << sizeof(st3) << endl;<br />cout << "ps: " << sizeof(ps) << endl;<br />cout << "*ps: " << sizeof(*ps) << endl;<br /><font color="#0000ff">*********************************************************</font><br /><br />输出l果为:<br />st1Q?28<br />st2Q?28<br />st3Q?28<br />psQ?4<br />*psQ?28<br /></font> </font> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************<br /></font>对于不同的STLQStringcȝl构定义会有所不同<br />所以不同的工具Q例如VC++Q和.NETQ结果会有所不同Q?br />在VC++6.0中(我的机器Q结果是16<br />?NET2003中结果是28<br />但是对于同一个编译器Q那么它的结果都是一定的<br /><br /><br /><font color="#0000ff"><strong>8.引用的sizeof</strong></font><br /><br /></font> </font> <font size="2"> <font face="Verdana"> <font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">sizeof操作W应用在引用cd上的时候,q回的是包含被引用对象所需的内存长度(卌引用对象的大)<br /></font> <br /> <font color="#0000ff">*********************************************************</font> <br />cout << "short:\t" << sizeof(short) << endl;<br />cout << "short*:\t" << sizeof(short*) << endl; <br />cout << "short&:\t" << sizeof(short&) << endl;<br />cout << "short[4]:\t" << sizeof(short[4]) << endl;<br />cout << "int&:\t" << sizeof(int&) << endl;<br /></font> </font> <font size="2"> <font face="Verdana"> <font color="#0000ff">*********************************************************<br /></font> <br />输出l果为:<br />shortQ?2<br />short*Q?4<br />short&Q?2<br />short[4]Q?8<br />int&Q?4<br /><br /><br /><strong><font color="#0000ff">9. l构体的sizeof</font></strong></font> </font> </p> <p> <font face="Verdana" size="2">q是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体Q?</font> </p> <p> <font face="Verdana" size="2">struct S1<br />{<br />    char c;<br />    int i;<br />}; </font> </p> <p> <font face="Verdana" size="2">问sizeof(s1){于多少Q?</font> </p> <p> <font face="Verdana" size="2">聪明的你开始思考了Qchar?个字节,int?个字节,那么加v来就应该??</font> </p> <p> <font face="Verdana" size="2">是这样吗Q?</font> </p> <p> <font face="Verdana" size="2">你在你机器上试过了吗Q?</font> </p> <p> <font face="Verdana" size="2">也许你是对的Q但很可能你是错的! </font> </p> <p> <font face="Verdana" size="2">VC6中按默认讄得到的结果ؓ8?br /><br />    WhyQؓ什么受伤的L我? </font> </p> <p> <font face="Verdana" size="2">请不要沮丧,我们来好好琢一下sizeof的定?—?sizeof的结果等于对象或者类型所占的内存字节数。好吧,那就让我们来看看S1的内存分配情况: </font> </p> <p> <font face="Verdana" size="2">S1 s1 = { 'a', 0xFFFFFFFF }; </font> </p> <p> <font face="Verdana" size="2">定义上面的变量后Q加上断点,q行E序Q观察s1所在的内存Q你发现了什么? </font> </p> <p> <font face="Verdana" size="2">以我的VC6.0ZQs1的地址?x0012FF78Q其数据内容如下Q?</font> </p> <p> <font face="Verdana" size="2">0012FF78: 61 CC CC CC FF FF FF FF<br /><br />发现了什么?怎么中间Ҏ?个字节的CCQ?</font> </p> <p> <font face="Verdana" size="2">看看MSDN上的说明Q?</font> </p> <p> <font face="Verdana" size="2">When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment. </font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">原来如此Q这是传说中的字节寚w啊!一个重要的话题出现了?</font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">Z么需要字节对齐? </font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">计算机组成原理教导我们,q样有助于加快计机的取数速度Q否则就得多花指令周期了?</font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">为此Q编译器默认会对l构体进行处理(实际上其它地方的数据变量也是如此Q,<font color="#0000ff">让宽度ؓ2的基本数据类型(short{)都位于能?整除的地址上,让宽度ؓ4的基本数据类型(int{)都位于能?整除的地址上?/font>以此cLQ这P两个C间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了?</font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">让我们交换一下S1中char与int的位|: </font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">struct S2<br />{<br />    int i;<br />    char c;<br />}; </font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">看看sizeof(S2)的结果ؓ多少Q怎么q是8?</font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">再看看内存,原来成员c后面仍然?个填充字节?</font> </p> <p dir="ltr" style="MARGIN-RIGHT: 0px"> <font face="Verdana" size="2">q又是ؓ什么啊Q别着急,下面ȝ规律?</font> </p> <p> <font face="Verdana" size="2">    <strong><font color="#0000ff">字节寚w的细节和~译器实现相养I但一般而言Q满三个准则:</font></strong><br />    1) l构体变量的首地址能够被其最宽基本类型成员的大小所整除Q?br />    2) l构体每个成员相对于l构体首地址的偏U量QoffsetQ都是成员大的整数倍,如有需要编译器会在成员之间加上填充字节Qinternal addingQ;<br />    3) l构体的dؓl构体最宽基本类型成员大的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing paddingQ?br /><br />    对于上面的准则,有几炚w要说明:<br />1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏U量了呢Q?</font> </p> <p> <font face="Verdana" size="2">因ؓ有了W?点存在,所以我们就可以只考虑成员的偏U量Q这h考v来简单。想想ؓ什么?</font> </p> <p> <font face="Verdana" size="2">l构体某个成员相对于l构体首地址的偏U量可以通过宏offsetof()来获得,q个宏也在stddef.h中定义,如下Q?</font> </p> <p> <font face="Verdana" size="2">#define offsetof(s,m) (size_t)&(((s *)0)->m) </font> </p> <p> <font face="Verdana" size="2">例如Q想要获得S2中c的偏U量Q方法ؓ </font> </p> <p> <font face="Verdana" size="2">size_t pos = offsetof(S2, c);// pos{于4 </font> </p> <p> <br /> <font face="Verdana" size="2">2) 基本cd是指前面提到的像char、short、int、float、doubleq样的内|数据类型。这里所说的“数据宽度”就是指其sizeof的大。由于结构体的成员可以是复合cdQ比如另外一个结构体Q所以在L最宽基本类型成员时Q应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将复合cd作ؓ整体看待?</font> </p> <p> <font face="Verdana" size="2">q里叙述h有点拗口Q思考v来也有点挠头Q还是让我们看看例子吧(具体数g以VC6ZQ以后不再说明)Q?</font> </p> <p> <font face="Verdana" size="2">struct S3<br />{<br />    char c1;<br />    S1 s;<br />    char c2;<br />}; </font> </p> <p> <font face="Verdana" size="2">S1的最宽简单成员的cd为intQS3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型ؓint。这P通过S3定义的变量,其存储空间首地址需要被4整除Q整个sizeof(S3)的g应该?整除?</font> </p> <p> <font face="Verdana" size="2">c1的偏U量?Qs的偏U量呢?q时s是一个整体,它作为结构体变量也满_面三个准则,所以其大小?Q偏U量?Qc1与s之间侉K?个填充字节,而c2与s之间׃需要了Q所以c2的偏U量?2Q算上c2的大ؓ13Q?3是不能被4整除的,q样末尾q得补上3个填充字节。最后得到sizeof(S3)的gؓ16?</font> </p> <p> <br /> <font face="Verdana" size="2">    通过上面的叙qͼ我们可以得到一个公式:<br />    <font color="#0000ff"><strong>l构体的大小{于最后一个成员的偏移量加上其大小再加上末填充字节数目Q?/strong></font>卻I </font> </p> <p> <font face="Verdana" size="2">sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding ) </font> </p> <p> <font face="Verdana" size="2"> </font> </p> <div> <font color="#0000ff"> <font size="2"> <font face="Verdana"> <strong>10.cȝsizeof</strong> </font> </font> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">cȝsizeof值等于类中成员变量所占用的内存字节数。如Q?br /></font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">****************************************************************</font> </font> </font> </div> <div> <font face="Verdana" size="2">  </font> </div> <div> <font face="Verdana" size="2">class A<br />{<br /> public:<br />     int b;<br />     float c;<br />     char d;<br />}; </font> </div> <div> <br /> <font face="Verdana" size="2">int main(void)<br />{<br />  A object;<br />  cout << "sizeof(object) is " << sizeof(object) << endl;<br />  return 0 ;<br />} </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">***************************************************************</font> </font> </font> </div> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">输出l果?2Q我的机器上sizeof(float)gؓ4Q字节对其前面已l讲q)?</font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">不过需要注意的是,如果cM存在静态成员变量,l果又会是什么样子呢Q?</font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">***************************************************************</font> </font> </font> </div> <div> <br /> <font face="Verdana" size="2">class A<br />{<br /> public:<br />     static int a;<br />     int b;<br />     float c;<br />     char d;<br />}; </font> </div> <div> <br /> <font face="Verdana" size="2">int main()<br />{ </font> </div> <div> <font face="Verdana" size="2">  A object;<br />  cout << "sizeof(object) is " << sizeof(object) << endl;<br />  return 0 ;<br />} </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">**************************************************************</font> </font> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">16Q不寏V结果仍然是12. </font> </div> <div> <br /> <font face="Verdana" size="2">因ؓ在程序编译期_已lؓstatic变量在静态存储区域分配了内存I间Qƈ且这块内存在E序的整个运行期间都存在?</font> </div> <div> <br /> <font face="Verdana" size="2">而每ơ声明了cA的一个对象的时候,对象在堆上,Ҏ对象的大分配内存?</font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">如果cA中包含成员函敎ͼ那么又会是怎样的情况呢Q看下面的例?</font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">*************************************************************</font> </font> </font> </div> <div> <br /> <font face="Verdana" size="2">class A<br />{<br /> public:<br />     static int a;<br />     int b;<br />     float c;<br />     char d;<br />     int add(int x,int y)<br />     {<br />       return x+y;<br />     }<br />}; </font> </div> <div> <br /> <font face="Verdana" size="2">int main()<br />{<br />  A object;<br />  cout << "sizeof(object) is " << sizeof(object) << endl;<br />  b = object.add(3,4);<br />  cout << "sizeof(object) is " << sizeof(object) << endl;<br />  return 0 ;<br />} </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font size="2"> <font face="Verdana"> <font color="#0000ff">***************************************************************</font> </font> </font> </div> <div> <font face="Verdana" size="2"> </font> </div> <div> <font face="Verdana" size="2">l果仍ؓ12?font color="#0000ff"></font></font> </div> <div> <font face="Verdana" color="#0000ff" size="2"> </font> </div> <div dir="ltr" align="left"> <span id="wmqeeuq" class="139102807-09122005"> <font face="Verdana" size="2">因ؓ只有非静态类成员变量在新生成一个object的时候才需要自q副本?</font> </span> </div> <div dir="ltr" align="left"> <span id="wmqeeuq" class="139102807-09122005"> <font face="Verdana" size="2">所以每个非静态成员变量在生成新object需要内存,而function是不需要的?</font> </span> </div> <div dir="ltr" align="left"> <span id="wmqeeuq" class="139102807-09122005"> <font face="Verdana" size="2"> </font> </span> </div> <div dir="ltr" align="left"> <span id="wmqeeuq" class="139102807-09122005"> <font face="Verdana" size="2"> </font> </span> </div> <div dir="ltr" align="left"> <span id="wmqeeuq" class="139102807-09122005"> <font face="Verdana" size="2">注:C++中的多态和虚承也是非帔R要的东西Q不q比较复杂,~译器不同,l节也有所不同。(以后慢慢研究Q哈哈)<br /><br /></font> </span> </div> <img src ="http://www.aygfsteel.com/majianan/aggbug/64664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/majianan/" target="_blank">马嘉?/a> 2006-08-20 21:59 <a href="http://www.aygfsteel.com/majianan/archive/2006/08/20/64664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">˺</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͻȪ</a>| <a href="http://" target="_blank">˷</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">μԴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˷</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Ͽ</a>| <a href="http://" target="_blank">̳</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Ž</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ں</a>| <a href="http://" target="_blank">ء</a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank">Į</a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank">׿</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>