• <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

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


            C++對象模型(8) - Chapter 3. The Semantics of Data
            ?

            作者: Jerry Cat
            時間: 2006/11/15
            鏈接:?
            http://m.shnenglu.com/jerysun0818/archive/2006/11/15/15185.html


            ;-----------------------------------------------------------------------
            ;Chapter 3. The Semantics of Data
            ;-----------------------------------------------------------------------
            Chapter 3. The Semantics of Data - 空類不空

            class X {};
            class Y : public virtual X {};
            class Z : public virtual X {};
            class A : public Y, public Z {};
            None of these classes contains any explicit data—any anything, in fact, except an inheritance
            relationship—so he apparently believed the size of each class should be 0. It wasn't,
            of course—not even the apparently benign class X:

            sizeof X yielded 1
            sizeof Y yielded 8
            sizeof Z yielded 8
            sizeof A yielded 12
            Let's look at each declaration in turn and see what's going on. An empty class, such as

            // sizeof X == 1
            class X {};
            in practice is never empty. Rather it has an associated size of 1 byte—a char member inserted
            by the compiler. This allows two objects of the class, such as

            X a, b;
            if ( &a == &b ) cerr << "yipes!" << endl;//to be allocated unique addresses in memory.哈!

            // sizeof Y == sizeof Z == 8
            class Y : public virtual X{};
            class Z : public virtual X{};
            On his machine, the size of both classes Y and Z is 8. This size, however, is partially machine dependent. It also depends in part on the compiler implementation being used. The given size of both class Y and class Z on any machine is the interplay of three factors:

            (1). Language support overhead. There is an associated overhead incurred in the language support of virtual base classes. Within the derived class, this overhead is reflected as some form of pointer, either to the virtual base class subobject or to an associated table within which either the address or offset to the virtual base class subobject is stored. On my correspondent's machine, the pointer is 4 bytes. (Virtual base classes are discussed in Section 3.4.)

            (2). Compiler optimization of recognized special cases. There is the 1 byte size of the virtual base class X subobject also present within Y (and Z). Traditionally, this is placed at the end of the "fixed" (that is, invariant) portion of the derived class. Some compilers now provide special support for an empty virtual base class (the paragraph following item 3 discusses this in more detail). Our correspondent's compiler, however, did not provide this special handling.

            (3). Alignment constraints. The size of class Y (and Z) at this point is 5 bytes. On most machines, aggregate structures have an alignment constraint so that they can be efficiently loaded from and stored to memory. On my correspondent's machine, alignment of an aggregate is on a 4-byte boundary. So class Y (and Z) requires 3 bytes of padding. The result is a final size of 8.

            The C++ object model representation for nonstatic data members optimizes for space and access time (and to preserve compatibility with the C language layout of the C struct) by storing the members directly within each class object. This is also true for the inherited nonstatic data members of both virtual and nonvirtual base classes, although the ordering of their layout is left undefined. Static data members are maintained within the global data segment of the program and do not affect the size of individual class objects.(靜態數據成員被放在全局數據段, 并不影響單個類的大小)
            ?
            Only one instance of a static data member of a class exists within a program regardless of the number of times that class is an object of direct or indirect derivation. (The static data members of a template class behave slightly differently. See Section 7.1 for a discussion.)模板類的靜態數據成語有所不同

            類的大小讓你吃驚地"大"的原因來源于2方面:
            (1). Additional data members added by the compilation system to support some language functionality (primarily the virtuals)

            (2). Alignment requirements on the data members and data structures as a whole

            posted on 2006-11-15 16:55 Jerry Cat 閱讀(566) 評論(0)  編輯 收藏 引用

            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久精品2019免费观看| 久久久久人妻精品一区二区三区 | 久久亚洲精品成人av无码网站| 久久久久国产视频电影| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久久青草青青国产亚洲免观| 久久伊人五月天论坛| 伊人久久无码中文字幕| 国产精品久久久久久| 亚洲精品国产自在久久| 国内精品伊人久久久久av一坑| 久久综合色区| 国产精品美女久久久久网| 日韩欧美亚洲综合久久影院Ds| 亚洲中文字幕无码久久2020 | 色综合合久久天天给综看| 麻豆AV一区二区三区久久| 久久久久97国产精华液好用吗| 亚洲AV成人无码久久精品老人| 国产99久久久国产精品~~牛| 精品国产福利久久久| 国产综合精品久久亚洲| 国内精品九九久久久精品| 青青热久久国产久精品| 亚洲狠狠综合久久| 久久久av波多野一区二区| 波多野结衣AV无码久久一区| 久久夜色撩人精品国产小说| 亚洲一区二区三区日本久久九| 人妻无码αv中文字幕久久琪琪布| 久久久久亚洲国产| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久国产热精品波多野结衣AV| 一本色道久久综合| 亚洲午夜无码AV毛片久久| 久久强奷乱码老熟女| 久久综合五月丁香久久激情| 亚洲国产高清精品线久久 | 久久精品国产AV一区二区三区 | 久久成人18免费网站| 久久国产三级无码一区二区|