• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0

            /********************************************\
            |????歡迎轉(zhuǎn)載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
            \********************************************/


            Chapter 2. The Semantics of Constructors
            ----------------------------------------
            2.1 Default Constructor Construction

            作者: Jerry Cat
            時間: 2006/04/27
            鏈接:?http://m.shnenglu.com/jerysun0818/archive/2006/04/28/6407.html

            ========================================
            Global objects are guaranteed to have their associated memory "zeroed out" at program start-up. Local objects allocated on the program stack and heap objects allocated on the free-store do not have their associated memory zeroed out; rather, the memory retains the arbitrary bit pattern of its previous use.

            If there is no user-declared constructor for class X, a default constructor is implicitly declared…. A constructor is trivial(瑣碎, 微不足道, 啥也不干) if it is an implicitly declared default constructor….

            1). Member Class Object with Default Constructor:
            If a class without any constructors contains a member object of a class with a default constructor, the implicit default constructor of the class is nontrivial and the compiler needs to synthesize a default constructor for the containing class. This synthesis, however, takes place only if the constructor actually needs to be invoked.

            An interesting question, then: Given the separate compilation model of C++, how does the compiler prevent synthesizing multiple default constructors, for example, one for file A.C and a second for file B.C? In practice, this is solved by having the synthesized default constructor, copy constructor, destructor, and/or assignment copy operator defined as inline. An inline function has static linkage and is therefore not visible outside the file within which it is synthesized. If the function is too complex to be inlined by the implementation, an explicit non-inline static instance is synthesized.

            For example, in the following code fragment, the compiler synthesizes a default constructor for class Bar:

            class Foo { public: Foo(), Foo( int ) ... };

            class Bar { public: Foo foo; char *str; };

            void foo_bar() {
            ?? Bar bar; // Bar::foo must be initialized here
            ?? if ( str ) { } ...
            }
            The synthesized default constructor contains the code necessary to invoke the class Foo default constructor on the member object Bar::foo, but it does not generate any code to initialize Bar::str. Initialization of Bar::foo is the compiler's responsibility; initialization of Bar::str is the programmer's. The synthesized default constructor might look as follows:

            ____To simplify our discussion, these examples ignore the insertion of the implicit this pointer.
            // possible synthesis of Bar default constructor
            // invoke Foo default constructor for member foo
            inline Bar::Bar()
            {
            ?? foo.Foo::Foo(); // Pseudo C++ Code
            }
            Again, note that the synthesized default constructor meets only the needs of the implementation, not the needs of the program.

            What happens if there are multiple class member objects requiring constructor initialization? The language requires that the constructors be invoked in the order of member declaration within the class. This is accomplished by the compiler. It inserts code within each constructor, invoking the associated default constructors for each member in the order of member declaration. This code is inserted just prior to the explicitly supplied user code. For example, say we have the following three classes:

            class Dopey?? { public: Dopey(); ... };
            class Sneezy? { public: Sneezy( int ); Sneezy(); ... };
            class Bashful { public: Bashful() ... };
            and a containing class Snow_White:

            class Snow_White {
            public:
            ?? Dopey dopey;
            ?? Sneezy sneezy;
            ?? Bashful bashful;
            ?? // ...
            private:
            ?? int mumble;
            };
            If Snow_White does not define a default constructor, a nontrivial default constructor is synthesized that invokes the three default constructors of Dopey, Sneezy, and Bashful in that order. If, on the other hand, Snow_White defines the following default constructor:

            // programmer coded default constructor
            Snow_White::Snow_White() : sneezy( 1024 )
            {
            ?? mumble = 2048;
            }
            it is augmented as follows:

            // Compiler augmented default constructor
            // Pseudo C++ Code
            Snow_White::Snow_White()
            {
            ?? // insertion of member class object constructor invocations
            ?? dopey.Dopey::Dopey();
            ?? sneezy.Sneezy::Sneezy( 1024 );
            ?? bashful.Bashful::Bashful();

            ?? // explicit user code
            ?? mumble = 2048;
            }

            2). Base Class with Default Constructor:
            Similarly, if a class without any constructors is derived from a base class containing a default constructor, the default constructor for the derived class is considered nontrivial and so needs to be synthesized. The synthesized default constructor of the derived class invokes the default constructor of each of its immediate base classes in the order of their declaration. To a subsequently derived class, the synthesized constructor appears no different than that of an explicitly provided default constructor.

            What if the designer provides multiple constructors but no default constructor? The compiler augments each constructor with the code necessary to invoke all required default constructors. However, it does not synthesize a default constructor because of the presence of the other user-supplied constructors. If member class objects with default constructors are also present, these default constructors are also invoked梐fter the invocation of all base class constructors.

            3). Class with a Virtual Function:
            There are two additional cases in which a synthesized default constructor is needed:

            (1). The class either declares (or inherits) a virtual function
            (2). The class is derived from an inheritance chain in which one or more base classes are virtual

            In both cases, in the absence of any declared constructors, implementation bookkeeping necessitates the synthesis of a default constructor. For example, given the following code fragment:

            class Widget {
            public:
            ?? virtual void flip() = 0;
            ?? // ...
            };

            void flip( const Widget& widget ) { widget.flip(); }

            // presuming Bell and Whistle are derived from Widget
            void foo() {
            ?? Bell b;? Whistle w;
            ?? flip( b );
            ?? flip( w );
            }
            the following two class "augmentations" occur during compilation:

            (3). A virtual function table (referred to as the class vtbl in the original cfront implementation) is generated and populated with the addresses of the active virtual functions for that class.
            (4). Within each class object, an additional pointer member (the vptr) is synthesized to hold the address of the associated class vtbl.

            In addition, the virtual invocation of widget.flip() is rewritten to make use of widget's vptr and flip()'s entry into the associated vtbl:

            ?? // simplified transformation of virtual invocation:
            widget.flip()
            ?? ( * widget.vptr[ 1 ] ) ( &widget )
            where:

            ____1 represents flip()'s fixed index into the virtual table, and

            ____&widget represents the this pointer to be passed to the particular invocation of flip().

            For this mechanism to work, the compiler must initialize the vptr of each Widget object (or the object of a class derived from Widget) with the address of the appropriate virtual table. For each constructor the class defines, the compiler inserts code that does just that (this is illustrated in Section 5.2). In classes that do not declare any constructors, the compiler synthesizes a default constructor in order to correctly initialize the vptr of each class object.

            4). Class with a Virtual Base Class:
            Virtual base class implementations vary widely across compilers. However, what is common to each implementation is the need to make the virtual base class location within each derived class object available at runtime. For example, in the following program fragment:

            class X { public: int i; };
            class A : public virtual X?? { public: int j; };
            class B : public virtual X?? { public: double d; };
            class C : public A, public B { public: int k; };
            // cannot resolve location of pa->X::i at compile-time
            void foo( const A* pa ) { pa->i = 1024; }

            main() {
            ?? foo( new A );
            ?? foo( new C );
            ?? // ...
            }
            the compiler cannot fix the physical offset of X::i accessed through pa within foo(), since the actual type of pa can vary with each of foo()'s invocations. Rather, the compiler must transform the code doing the access so that the resolution of X::i can be delayed until runtime. In the original cfront implementation, for example, this is accomplished by inserting a pointer to each of the virtual base classes within the derived class object. All reference and pointer access of a virtual base class is achieved through the associated pointer. In our example, foo() might be rewritten as follows under this implementation strategy:

            // possible compiler transformation
            void foo( const A* pa ) { pa->__vbcX->i = 1024; }
            where?__vbcX represents the compiler-generated pointer to the virtual base class X.

            As you've no doubt guessed by now, the initialization of __vbcX (or whatever implementation mechanism is used) is accomplished during the construction of the class object. For each constructor the class defines, the compiler inserts code that permits runtime access of each virtual base class. In classes that do not declare any constructors, the compiler needs to synthesize a default constructor.

            2.1 小結(jié):
            =-=-=-=-=
            Programmers new to C++ often have two
            common misunderstandings:

            ? 1. That a default constructor is synthesized for every class that does not define one
            ? 2. That the compiler-synthesized default constructor provides explicit default initializers for each data member declared within the class

            posted on 2006-04-28 03:00 Jerry Cat 閱讀(1052) 評論(3)  編輯 收藏 引用

            FeedBack:
            # re: C++對象模型(4) - Default Constructor Construction
            2006-04-28 18:39 | dfdffddffdfd
            你些的我看不懂,小樣,我8級的也看不懂~~~~請你編個中文版的解說。
            知道不??????????????????  回復(fù)  更多評論
              
            # re: C++對象模型(4) - Default Constructor Construction
            2006-04-28 18:51 | 婀娜
            彩運500萬福彩3D110期預(yù)測
            膽碼:34

            復(fù)式:復(fù)式:123/357/014
            喜歡合買的朋友,可以加我QQ448967360聊聊!
            彩運500萬http://www.cy500.com
              回復(fù)  更多評論
              
            # re: C++對象模型(4) - Default Constructor Construction
            2006-04-29 01:04 | Jerry Cat
            dfdffddffdfd, 小樣不小樣免了吧:) 8級有用么? 你不是學(xué)計算機的吧? 這非我寫, 乃C++大師Stanley所寫, 國內(nèi)學(xué)校100級英語也不行呀! 不是對你有任何看法, 大家一起努力吧! 只不過想到外企拿高薪并且35歲后不失業(yè), 不能心浮, 要靜心好好地去學(xué)!

            --------------------------------------------------

            (附: 請在小弟處只談asm, c, C++, 別的免談, 這句送給哪個買啥鳥彩票的朋友!)  回復(fù)  更多評論
              

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



            <2006年10月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久婷婷色香五月综合激情 | 国产精品中文久久久久久久| 99久久免费国产特黄| 成人免费网站久久久| 久久午夜无码鲁丝片午夜精品| 久久久久国产精品麻豆AR影院| 久久笫一福利免费导航| 婷婷久久香蕉五月综合加勒比| 91久久精品国产91性色也| 久久久久99精品成人片三人毛片 | 国产精品久久久久aaaa| 国产福利电影一区二区三区,免费久久久久久久精 | 久久久久人妻精品一区三寸蜜桃| 欧美激情一区二区久久久| 人妻久久久一区二区三区| 激情综合色综合久久综合| 7777久久久国产精品消防器材| 2021久久精品国产99国产精品| 亚洲日本久久久午夜精品| 精品无码久久久久久尤物| 色青青草原桃花久久综合| 99麻豆久久久国产精品免费| 中文字幕无码久久人妻| 99久久婷婷国产综合精品草原| 亚洲va久久久噜噜噜久久狠狠 | 久久久WWW免费人成精品| 国内精品九九久久久精品| 久久久亚洲AV波多野结衣| 国产精品99久久久久久猫咪| 久久久av波多野一区二区| 中文精品久久久久人妻| 色8激情欧美成人久久综合电| 亚洲成人精品久久| 久久人人爽人人爽人人片AV麻豆| 天天躁日日躁狠狠久久| 亚洲国产精品无码久久久蜜芽| 丁香狠狠色婷婷久久综合| 新狼窝色AV性久久久久久| 伊人久久大香线蕉AV色婷婷色| 一级女性全黄久久生活片免费| 久久性生大片免费观看性|