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

            高山流水

            ----- 要黑就黑徹底

            Inside The C++ Object Model 學習筆記--The Semantics of Data

            Chapter 3. The Semantics of Data : Data 語義學

            示例代碼:
            class X {};
            class Y : public virtual X {};
            class Z : public virtual X {};
            class A : public Y, public Z {};


            一個類對象的大小受三個因素的影響
            i.?? 語言本身所造成的額外負擔(overhead),? 當語言要支持virtual base class 時,就會導致一些額外的負擔.
            ii.? 編譯器對特殊情況所提供的優化處理,? 如virtual base class class X subobject 的1bytes大小會出現在子類Y, Z的身上.
            ????? 如: sizeof(Y) = sizeof(Z) = 4(8) // 這里的4(8)和編譯器相關
            ?????
            ????? 有時候有的編譯器會用empty virtual base class 技術來優化, VC就是采用這一技術的, 這樣virtual base class 就不用占用大小了.

            iii.? Alignment 的限制, Y和Z的大小本來大小都是4, 加上virtual base subobject的1bytes的大小共5個字節, 但實際上去是8bytes,這里就是受到字節對齊的影響.

            C++對象模型對數據的存放結構是:
            i.?? 把nonstatic data members直接的放在class object之中, 對繼承(不管是virtual 或 nonvirtual base class )而來的nonstatic data members也是這一樣的.
            ii.? 沒有強制定義其間的排列順序
            iii. 對static data members, 則被放置在一個global data segment中, 不會影響單個類的大小, 并且只保存一份實體. (template有所不同)

            3.1 Data Member的綁定(The Binding of Data Member)
            ??? 示例代碼:

            ?1?//?A?third?party?foo.h?header?file?
            ?2??//?pulled?in?from?somewhere?
            ?3??extern?float?x;?
            ?4?
            ?5??//?the?programmer's?Point3d.h?file?
            ?6??class?Point3d?
            ?7??{?
            ?8??public:?
            ?9?????Point3d(?float,?float,?float?);?
            10?
            11?????//?question:??which?x?is?returned?and?set??
            12?????float?X()?const?{?return?x;?}?
            13?
            14?????void?X(?float?new_x?)?const?{?x?=?new_x;?}?
            15?
            16?????//??
            17?
            18??private:?
            19?????float?x,?y,?z;?
            20??};?
            21?
            22?


            ?在早期的編譯器中會出錯, 不過在 C++2.0后就不會了, 在C++2.0后, 采用的是"rewriting rule" == "member scope rsolution rule" 規則來處理它.
            ?以前的編譯器中, float X() const { return x; }, 它不知道要返回哪一個x, 這里它會返回全局的 extern float x, 所以是不正確的. 后來的編譯器是會在整個class的聲明都出現了后才會分析member functions, 所以它不會現錯.

            ?對于下面的例子還是會出錯, 因為對于member functions signatures的分析不會到類完成以后, 而是第一次出現的時候就會分析的. 如下面的:

            ??所以最好始終的把"nested type declare" 放在類的起始處. (這在STL中好像最明顯, 都是先聲明的)


            3.2 Data Member的布局 (Data Member Layout)

            示例代碼:?

            ?1?class?Point3d?{?
            ?2??public:?
            ?3?
            ?4?????//??
            ?5?
            ?6??private:?
            ?7?????float?x;?
            ?8?????static?List<Point3d*>?*freeList;?
            ?9?????float?y;?
            10?????static?const?int?chunkSize?=?250;?
            11?????float?z;?
            12??};?
            13?

            ????? Data Member的布局按如下的規則:
            ????? i.?? Nonstatic data member 在class object中的排列順序和被聲明的順序是一樣的, 任何中間介入的static data member都不會被放進對象的布局中.
            ????? ii.? 要求在同一access section中"較晚出現的members在class object中有較高的地址"這一條件就可以.
            ????? iii. 編譯器可能會合成一些內部使用的data members, 以支持整個對象模型, 如vptr指針.? 對于它的具體位置, C++ Standard 沒有規定, 由編譯器產商自己決定. 不過傳統上一般是放在所有聲明的members的最后, 也有把vptr放在所有class object的最前端的.


            3.3 Data Member的存取
            示例:
            ????? Point3d?origin, *pt = &origin;
            ????? origin.x??? = 0.0;
            ????? pt->x = 0.0

            1. Static Data Members的存取
            ??? 每一個static data member只有一個實體,存在于程序的data segment中。每次程序取用這個static data member的時候,就會被轉化為對該實體的唯一的extern實體的直接參考操作.? 用指針存取一個數和用對象去存取一個數是一樣的。
            ????
            2. Nostatic Data Members的存取
            ??? Nostatic data member 直接存放在每一個class object之中,除非經由明確的或暗喻的class object,否則沒有辦法直接的存取它們。
            ??? 例如:
            ??? Point3d? Point3d::translate( const Point3d &pt )
            ??? {
            ??? x += pt.x;
            ??? y += pt.y;
            ??? z += pt.z;
            ??? }
            ??? 實際經過轉換后為:
            ??? Point3d? Point3d::translate( Point3d *const this, const Point3d &pt )
            ??? {
            ???? this->x += pt.x;
            ??? this->y += pt.y;
            ??? this->z += pt.z;
            ??? }
            ??? 對nostatic data member的訪問是這樣的:?
            ?origin._y = 0.0;?
            ??? 實際轉換操作是:
            ??????? &origin + (&Point3d::_y - 1 );
            ??????
            ?????? 注意:? 這里的-1操作。指向data member的指針,其offset值總是被加上1, 這樣可以使編譯系統區分出:
            ?i.? 一個用以指出class的第一個member的data member的指針.
            ?ii. 一個沒有指出任何member的data member的指針.
            ??
            ??? 如果是virtual 繼承的話,就可以不一樣了,可能要多加層的訪問層; 也可能要到運行時才能決定,由編譯器所決定.


            3.4 “繼承”與Data Member
            ?示例數據:

            ?1??//?supporting?abstract?data?types?
            ?2??class?Point2d
            ?3??{?
            ?4??public:?
            ?5???//?constructor(s)?
            ?6???//?operations?
            ?7???//?access?functions?
            ?8??private:?
            ?9???float?x,?y;?
            10??};?
            11?
            12??///?
            13??class?Point3d
            14??{?
            15??public:?
            16???//?constructor(s)?
            17???//?operations?
            18???//?access?functions?
            19??private:?
            20???float?x,?y,?z;?
            21??};?
            22?

            ??? C++的繼承模型:
            ?在C++的繼承模型中, 一個derived class object 所表現出來的東西,是其自己的member加上其base class(es) member的總和。對于數據成員出現的順序在C++ Standard 中沒有規定。從下面幾個方面來討論數據繼承:
            ?i.?? 單一繼承且不含有virtual functions
            ?ii.?? 單一繼承并含有virtual functions
            ?iii.? 多重繼承
            ?iV. 虛擬繼承

            1. 只要繼承不要多態(Inheritance Without Polymoophism)
            ??? 繼承一般不會增加空間或存取時間。但繼承有時會有這樣兩種情況出現:
            ??? i.?? 經驗不足的人有時可能會重復的設計一些相同的函數.
            ??? ii.? 把一個類分解為多層,有可能會為了表現class的體系抽象化,使所需要的空間膨脹。
            ??????? 因為C++語言要保證: 出現在derived class 中的base class subobject 有其完整原樣性。

            2. 加上多態(Adding Polymorphism)
            ??? 如:

            ?1??class?Point2d?
            ?2??{?
            ?3??public:?
            ?4?????Point2d(?float?x?=?0.0,?float?y?=?0.0?)?
            ?5????????:?_x(?x?),?_y(?y?)?{};?
            ?6?
            ?7?????//?access?functions?for?x?&?y?same?as?above?
            ?8?????//?invariant?across?type:?not?made?virtual?
            ?9???
            10?????//?add?placeholders?for?z??do?nothing??
            11?????virtual?float?z(){?return?0.0?};?
            12?????virtual?void?z(?float?)?{}?
            13?
            14?????//?turn?type?explicit?operations?virtual?
            15?????virtual?void?operator+=(?const?Point2d&?rhs?)
            16?????{?
            17?????????_x?+=?rhs.x();?_y?+=?rhs.y();
            18??????}?
            19???
            20?????//??more?members?
            21?
            22??protected:?
            23???float?_x,?_y;?
            24??};?
            25?
            26?


            ?//
            ?要支持多態,Point2d數據成員要做如下的工作:
            ?i.?? 導入一個和Point2d有關的virtual table(vtbl), 存放它聲明的每一個virtual function的地址
            ?ii.?? 在每個class object中導入一個vptr, 提供執行期的鏈接,使每個object都能找到相應的virtual table.
            ?iii.? 加強construtor, 使它能夠為vptr設定初值,讓它指向class所對應的virtual table.
            ?iV.? 加強destructor, 使它能夠抹消"指向class的相關"virtual table" 的vptr.

            ?Figure 3.3. Data Layout: Single Inheritance with Virtual Inheritance
            ?

            3. 多重繼承(Multiple Inheritance)
            ?
            ?
            4. 虛擬繼承(Virtual Inheritance)
            ??? Class 中如果含一個或多個virtual base class subobjects, 它將被分為兩個部分: 一個不變的局部和一個共享的局部.
            ??? i.?? 不變的局部中的數據,不管后繼如何衍化,總有固定的offset, 所這一部分的數據可以直接的被存取。
            ??? ii.? 共享的局部,所表現的就是virtual base class subobject, 這一部分的數據會因為每次派生的操作而有變化, 所以它們只能間接的存取。


            3.5 對象成員的效率(Object Member Efficiency)

            3.6 指向數據成員的指針(Point to Data Members)

            posted on 2006-10-30 14:36 猩猩 閱讀(199) 評論(0)  編輯 收藏 引用 所屬分類: C&C++語言

            91精品国产综合久久久久久| 久久妇女高潮几次MBA| 久久精品亚洲日本波多野结衣 | 性做久久久久久久久老女人| 伊人色综合九久久天天蜜桃 | 欧美精品福利视频一区二区三区久久久精品 | 99久久国产综合精品麻豆| 伊人久久大香线蕉精品| 亚洲欧洲久久久精品| 色欲综合久久躁天天躁蜜桃| 天天综合久久久网| 久久亚洲sm情趣捆绑调教 | 久久久久国产| 精品国产99久久久久久麻豆| 伊人久久大香线焦综合四虎| 国产成人精品综合久久久久 | 久久午夜羞羞影院免费观看| 国产精品九九久久精品女同亚洲欧美日韩综合区| 久久成人精品| 久久国产精品久久精品国产| 亚洲精品无码久久千人斩| 国产精品免费看久久久香蕉| 麻豆成人久久精品二区三区免费| 午夜精品久久影院蜜桃| 99久久精品免费观看国产| 精品久久久无码21p发布| 日本亚洲色大成网站WWW久久| 99久久国产免费福利| 精品久久久久久中文字幕| 九九精品99久久久香蕉| 久久国产劲爆AV内射—百度| 亚洲国产精品综合久久网络| 久久久久久亚洲精品不卡 | 久久精品国产99国产精品亚洲 | 久久久久亚洲AV无码专区体验| 日韩久久久久中文字幕人妻| 久久se精品一区精品二区国产| 久久成人国产精品一区二区| 久久久艹| 久久久久青草线蕉综合超碰| 久久这里有精品|