青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

高山流水

----- 要黑就黑徹底

Inside The C++ Object Model 學(xué)習(xí)筆記--The Semantics of Data

Chapter 3. The Semantics of Data : Data 語義學(xué)

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


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

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

C++對象模型對數(shù)據(jù)的存放結(jié)構(gòu)是:
i.?? 把nonstatic data members直接的放在class object之中, 對繼承(不管是virtual 或 nonvirtual base class )而來的nonstatic data members也是這一樣的.
ii.? 沒有強(qiáng)制定義其間的排列順序
iii. 對static data members, 則被放置在一個global data segment中, 不會影響單個類的大小, 并且只保存一份實(shí)體. (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" 規(guī)則來處理它.
?以前的編譯器中, float X() const { return x; }, 它不知道要返回哪一個x, 這里它會返回全局的 extern float x, 所以是不正確的. 后來的編譯器是會在整個class的聲明都出現(xiàn)了后才會分析member functions, 所以它不會現(xiàn)錯.

?對于下面的例子還是會出錯, 因?yàn)閷τ趍ember functions signatures的分析不會到類完成以后, 而是第一次出現(xiàn)的時候就會分析的. 如下面的:

??所以最好始終的把"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的布局按如下的規(guī)則:
????? i.?? Nonstatic data member 在class object中的排列順序和被聲明的順序是一樣的, 任何中間介入的static data member都不會被放進(jìn)對象的布局中.
????? ii.? 要求在同一access section中"較晚出現(xiàn)的members在class object中有較高的地址"這一條件就可以.
????? iii. 編譯器可能會合成一些內(nèi)部使用的data members, 以支持整個對象模型, 如vptr指針.? 對于它的具體位置, C++ Standard 沒有規(guī)定, 由編譯器產(chǎn)商自己決定. 不過傳統(tǒng)上一般是放在所有聲明的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只有一個實(shí)體,存在于程序的data segment中。每次程序取用這個static data member的時候,就會被轉(zhuǎn)化為對該實(shí)體的唯一的extern實(shí)體的直接參考操作.? 用指針存取一個數(shù)和用對象去存取一個數(shù)是一樣的。
????
2. Nostatic Data Members的存取
??? Nostatic data member 直接存放在每一個class object之中,除非經(jīng)由明確的或暗喻的class object,否則沒有辦法直接的存取它們。
??? 例如:
??? Point3d? Point3d::translate( const Point3d &pt )
??? {
??? x += pt.x;
??? y += pt.y;
??? z += pt.z;
??? }
??? 實(shí)際經(jīng)過轉(zhuǎn)換后為:
??? 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;?
??? 實(shí)際轉(zhuǎn)換操作是:
??????? &origin + (&Point3d::_y - 1 );
??????
?????? 注意:? 這里的-1操作。指向data member的指針,其offset值總是被加上1, 這樣可以使編譯系統(tǒng)區(qū)分出:
?i.? 一個用以指出class的第一個member的data member的指針.
?ii. 一個沒有指出任何member的data member的指針.
??
??? 如果是virtual 繼承的話,就可以不一樣了,可能要多加層的訪問層; 也可能要到運(yùn)行時才能決定,由編譯器所決定.


3.4 “繼承”與Data Member
?示例數(shù)據(jù):

?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 所表現(xiàn)出來的東西,是其自己的member加上其base class(es) member的總和。對于數(shù)據(jù)成員出現(xiàn)的順序在C++ Standard 中沒有規(guī)定。從下面幾個方面來討論數(shù)據(jù)繼承:
?i.?? 單一繼承且不含有virtual functions
?ii.?? 單一繼承并含有virtual functions
?iii.? 多重繼承
?iV. 虛擬繼承

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

2. 加上多態(tài)(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?


?//
?要支持多態(tài),Point2d數(shù)據(jù)成員要做如下的工作:
?i.?? 導(dǎo)入一個和Point2d有關(guān)的virtual table(vtbl), 存放它聲明的每一個virtual function的地址
?ii.?? 在每個class object中導(dǎo)入一個vptr, 提供執(zhí)行期的鏈接,使每個object都能找到相應(yīng)的virtual table.
?iii.? 加強(qiáng)construtor, 使它能夠?yàn)関ptr設(shè)定初值,讓它指向class所對應(yīng)的virtual table.
?iV.? 加強(qiáng)destructor, 使它能夠抹消"指向class的相關(guān)"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.?? 不變的局部中的數(shù)據(jù),不管后繼如何衍化,總有固定的offset, 所這一部分的數(shù)據(jù)可以直接的被存取。
??? ii.? 共享的局部,所表現(xiàn)的就是virtual base class subobject, 這一部分的數(shù)據(jù)會因?yàn)槊看闻缮牟僮鞫凶兓? 所以它們只能間接的存取。


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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩一区二区三区在线| 国产乱码精品一区二区三区av| 亚洲专区欧美专区| 久久久久久久久久久久久女国产乱 | 亚洲欧美中日韩| 99re66热这里只有精品4| 久久久久久久久综合| 欧美在线亚洲综合一区| 欧美三级日韩三级国产三级| 亚洲国产精品久久久久婷婷老年| 国产视频一区二区在线观看| 在线视频精品一| 亚洲乱码久久| 久久久久亚洲综合| 久久在线视频| 国产一本一道久久香蕉| 亚洲欧美日韩国产一区| 亚洲综合国产精品| 国产精品美女久久久浪潮软件 | 欧美jizz19hd性欧美| 国产一区二区三区av电影| 亚洲伊人一本大道中文字幕| 亚洲午夜一级| 国产精品视频网址| 亚洲欧美日韩高清| 久久精品欧洲| 精品88久久久久88久久久| 欧美亚洲一区二区在线观看| 久久久久国产精品午夜一区| 国产亚洲综合性久久久影院| 欧美影院成年免费版| 久久久青草青青国产亚洲免观| 国产美女一区| 欧美专区日韩视频| 老司机一区二区| 亚洲高清免费| 欧美aa国产视频| 亚洲精选视频免费看| 亚洲视频一区二区| 国产日韩欧美一区二区三区四区| 欧美在线播放| 欧美激情 亚洲a∨综合| 一区二区三区精品视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 久久精品亚洲一区二区三区浴池| 狠狠色噜噜狠狠狠狠色吗综合| 久久精品国产99| 亚洲激情av在线| 香蕉久久夜色精品国产| 红杏aⅴ成人免费视频| 久久米奇亚洲| 亚洲免费av片| 久久久久国产精品麻豆ai换脸 | 韩国女主播一区| 欧美成人免费网站| 亚洲性图久久| 欧美国产日产韩国视频| 亚洲视频综合| 好看的日韩视频| 欧美精品在线视频| 亚洲一区二区黄| 欧美波霸影院| 亚洲欧美卡通另类91av| 好吊色欧美一区二区三区四区| 欧美jjzz| 欧美一区网站| avtt综合网| 欧美成人免费视频| 欧美在线3区| 日韩一级在线| 黄色国产精品| 国产精品第一区| 你懂的一区二区| 性色一区二区三区| 艳女tv在线观看国产一区| 久久综合色播五月| 午夜欧美大尺度福利影院在线看| 亚洲三级免费观看| 精品9999| 好吊色欧美一区二区三区视频| 欧美日韩精品在线播放| 欧美www视频| 久久免费视频在线| 性欧美1819性猛交| 亚洲视频图片小说| 日韩午夜在线播放| 亚洲第一天堂无码专区| 美女任你摸久久| 久久精品理论片| 午夜一级在线看亚洲| 亚洲视频在线免费观看| a4yy欧美一区二区三区| 91久久综合| 亚洲欧洲日本专区| 在线免费不卡视频| 激情综合色综合久久| 国产女精品视频网站免费| 欧美视频在线观看免费| 欧美日韩一区二区三区在线观看免| 免费观看成人| 欧美国产日韩免费| 欧美国产亚洲另类动漫| 女女同性精品视频| 欧美成人午夜免费视在线看片| 久久亚洲精品视频| 麻豆精品在线观看| 欧美大片在线影院| 欧美另类高清视频在线| 欧美精品啪啪| 欧美午夜精品理论片a级大开眼界| 欧美日本亚洲韩国国产| 欧美日韩国产黄| 欧美日韩一区二区三区高清| 欧美日韩精品一本二本三本| 欧美日韩伦理在线免费| 欧美午夜免费| 国产日韩一区二区三区| 国产一区二区三区无遮挡| 国产亚洲欧美日韩日本| 尤物精品在线| 亚洲日韩第九十九页| 亚洲一区二区免费视频| 午夜在线视频观看日韩17c| 欧美在线一区二区三区| 久久综合伊人| 亚洲国产精品女人久久久| 亚洲精品视频在线观看网站| 一本久久精品一区二区| 午夜国产精品影院在线观看| 欧美一区二区三区视频在线| 久久免费视频网站| 欧美日本一道本在线视频| 国产精品任我爽爆在线播放 | 一区二区三区.www| 欧美一站二站| 欧美v国产在线一区二区三区| 亚洲精品免费一区二区三区| 亚洲一级免费视频| 乱中年女人伦av一区二区| 欧美日韩精品是欧美日韩精品| 国产日韩av高清| 亚洲久久一区| 欧美一区二区三区免费看 | 亚洲日本在线观看| 亚洲一区二区三区在线看| 久久久久久久综合色一本| 欧美日韩国产精品| 狠狠色丁香久久综合频道| 亚洲午夜高清视频| 老司机午夜精品视频| 亚洲色图自拍| 麻豆av一区二区三区久久| 国产精品久久久久久亚洲毛片| 欲香欲色天天天综合和网| 亚洲性xxxx| 亚洲国产导航| 久久国产精彩视频| 欧美四级伦理在线| 最新中文字幕一区二区三区| 欧美亚洲视频一区二区| 亚洲国产成人在线播放| 久久精品一区蜜桃臀影院| 国产精品成av人在线视午夜片| 亚洲电影观看| 久久精品一区二区三区不卡| 日韩午夜视频在线观看| 欧美mv日韩mv亚洲| 在线观看日韩av电影| 久久电影一区| 亚洲与欧洲av电影| 欧美日韩精品一区二区在线播放 | 99re66热这里只有精品4| 麻豆成人91精品二区三区| 国产亚洲欧洲997久久综合| 亚洲在线黄色| 亚洲另类在线视频| 欧美精品播放| 亚洲美女黄网| 亚洲电影av在线| 久久日韩粉嫩一区二区三区| 韩日欧美一区二区| 久久精品亚洲精品| 午夜宅男欧美| 国产色视频一区| 久久国产主播精品| 午夜精品久久久久久久| 国产精品一区二区三区四区| 亚洲免费一级电影| 亚洲图片欧洲图片日韩av| 国产精品99一区二区| 亚洲综合视频在线| 亚洲综合视频1区| 国产区在线观看成人精品| 欧美有码视频| 欧美专区在线观看一区| 狠狠v欧美v日韩v亚洲ⅴ| 久久婷婷成人综合色| 久久最新视频| 亚洲伦理网站| 一区二区国产在线观看|