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

Basic Sample Senario :

Client 需要一種組件提供一種 FastString類, 此類具有 int length() 方法

解決方案:

靜態(tài)鏈接 : 組件廠商將源代碼交給 client ,客戶將組件代碼與client 代碼編譯連接運行。 如果組件代碼需要fix bug or update ,則client 端代碼需要重新編譯連接。 而且client軟件的不同實例使用各自的組件內(nèi)存對象。

動態(tài)鏈接 : 組件廠商使用DLL形式發(fā)放組件,此時不同的client實例可以共享組件在內(nèi)存中的代碼段。

DLL的問題:1.導出名稱的問題 : 不同的compiler可以使用不同的mangle name 用來區(qū)分 c++的函數(shù),那么使用不同的compiler的client和組件無法鏈接 (可以使用extern “C”解決全局函數(shù)名的問題,使用 .DEF文件解決導出成員函數(shù)的問題)

                   2.升級的問題 :如果組件最初定義為

class FastString
{
    char* m_psz;
public:
    FastString(const char* psz){strcpy(m_psz, psz);}
};

                                          而后廠商更改了組件的實現(xiàn)

class FastString
{
int newmember;
char* psz;
public:

FastString(const char* psz){strcpy(m_psz, psz);}

}

原來FastString對象大小為4字節(jié),現(xiàn)在變?yōu)?字節(jié),但是client端按照4字節(jié)分配對象, dll卻要向后面的4個字節(jié)存入一個指針,行為不可預料!

解決這一問題的一種方法便是每次發(fā)布便更改dll的名字,即1.0, 2.0, x.0 等等。但這樣比較弱啊!!

這種問題根本原因是啥呢?

class 的關(guān)鍵在于封裝了其中的實現(xiàn)細節(jié),即用戶知道類提供了哪些服務(wù)( public方法)就行了,不需要管類的內(nèi)部到底使用了哪些成員變量。這樣一來,只要接口沒變(類提供功能),user就可以安心的使用任意版本的實現(xiàn)了。C++怎么不行呢?C++告訴用戶接口的同時,也告訴了用戶類的實現(xiàn)(對象布局)。比如類對象有多大啊,每個成員的偏移啊(具體可以看Inside c++ object model)。知道了這些,客戶端使用接口的代碼就和DLL中的具體實現(xiàn)緊密的耦合起來了,杯具 啊~

咋辦呢? 只要不讓client直接創(chuàng)建FastString就行了,這樣client的代碼就不會受到FastString實現(xiàn)變化的影響了。給FastString加一個Wrapper類,內(nèi)部嵌套一個FastString,所有對FastString的調(diào)用都foward給內(nèi)部的FastString member, 創(chuàng)建FastString 的任務(wù)在dll方面完成,client只知道Wrapper大小為4個字節(jié)--指向FastString的指針。這樣問題解決了,但是太麻煩了,所有的接口都要包一層!! 而且多了一層調(diào)用!

還有啥辦法么? 為了保證c++接口類實現(xiàn)二進制級別的兼容只能使用編譯器無關(guān)的特性:1.假設(shè)復合類型表現(xiàn)形式相同(struct) 2. 傳參順序相同,可以使用指示符指定3.虛函數(shù)調(diào)用機制相同,即基于 vtbl 和 vptr. 基于這些假設(shè),我們創(chuàng)建的c++接口類所有函數(shù)設(shè)置為虛函數(shù),那么不同compiler將為客戶端方法調(diào)用產(chǎn)生相同的機器代碼。定義了接口,便規(guī)定了所有繼承于他的類的內(nèi)存結(jié)構(gòu)一定與它兼容。但此時不能告訴用戶類的定義,否則重回上面的老路上了。怎么辦,只有接口客戶無法創(chuàng)建類的定義,只有export一個創(chuàng)建類對象的函數(shù)客戶了。  同上面的wrapper一樣,創(chuàng)建類的操作僅僅在dll內(nèi)部調(diào)用,這意味著實際建造類對象大小和布局的代碼與編譯實現(xiàn)類的方法的代碼使用同樣的編譯器創(chuàng)建 (即ctor和call ctor的代碼由同一編譯器同時編譯)。由于虛析構(gòu)函數(shù)在vtbl的位置與compiler相關(guān),所以不能把它設(shè)置為虛函數(shù),只有顯示增加一個Delete函數(shù)完成析構(gòu)工作。

OK,當前我們得到的DLL中只有創(chuàng)建類對象的函數(shù)需要用extern “C”export 給客戶,其他的接口中的虛函數(shù)是通過虛表訪問的,無需靠符號名字鏈接。

進一步的,如果我們要給接口增加一個功能呢? 如果直接在現(xiàn)有接口中方法聲明后加入新的方法,那么此方法會出現(xiàn)在vtbl的最后一欄,舊的client不會調(diào)用新方法,但是如果新的client訪問老的對象呢? 不幸的事情發(fā)生了! 這樣做的問題在于,修改公開的接口就打破了對象的封裝性。

那么增加接口功能只能通過設(shè)計一個接口繼承另一個接口,或者讓類繼承多個接口來實現(xiàn)了。客戶可以在運行時通過RTTI來詢問對象,支持這個功能不,親?然而 ,RTTI也是一個compiler相關(guān)的東東,好吧,我們讓每個類自己實現(xiàn)RTTI,也就是實現(xiàn)一個dynamic_cast 方法, 用來將自己cast成為自己實現(xiàn)的接口,如果不支持則返回 0 。

例如:

void* CFastString::Dynamic_Cast(const char* pszTypename)
{
void * pRev;
if(strcmp(pszTypename, "IFastString") == 0)
{
pRev = static_cast<IFastString*>(this);
}
else if(strcmp(pszTypename , "IOut") == 0)
{
pRev = static_cast<IOut*>(this);
}
else if(strcmp(pszTypename , "IExtent") == 0)
{
pRev = static_cast<IFastString*>(this);
}
else
{
return 0;
}

return pRev;
}

注意cast到IExtent的時候用了IFastString,因為IFastString 和 IOut都是從IExtent繼承的,寫IExtent的話不知道用哪個,用虛擬繼承可以使CFastString對象只有一份IExtent,為啥不用呢? 你懂得。。。跟前面答案一樣,編譯器相關(guān)。

最后一個問題是delete的問題,用戶需要記得為每一個對象調(diào)用一次delete方法,而指針cast來cast去,想記得對象被delete沒有很難啊! 怎么辦? 用引用計數(shù)吧,把每個指針當做具有生命周期的實體,創(chuàng)建時候計數(shù)++,銷毀時候--,等到0的時候就delete對象。

大功告成,通過vptr和vtbl的二進制防火墻,我們做到了可重用的二進制組件,組件變化客戶無需重新編譯 。

Feedback

# re: COM 本質(zhì)論筆記 第一章 com 是一個更好的c++  回復  更多評論   

2011-08-23 23:51 by 陳梓瀚(vczh)
更新的時候連exe一起換掉就好了,現(xiàn)在網(wǎng)速那么快

# re: COM 本質(zhì)論筆記 第一章 com 是一個更好的c++  回復  更多評論   

2011-09-05 11:42 by 戰(zhàn)痘小天使
up,期待第二篇
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩一区二区在线| 国产欧美va欧美不卡在线| 91久久精品国产91性色| 久久免费精品视频| 久久午夜电影| 久久久水蜜桃| 免费在线观看日韩欧美| 老司机精品导航| 欧美国产精品v| 亚洲日本成人| 亚洲午夜精品一区二区| 亚洲欧美在线免费| 久久精品国产亚洲精品| 久久婷婷影院| 欧美华人在线视频| 欧美日韩一区二区三区在线看| 欧美日韩一本到| 国色天香一区二区| 日韩一区二区精品葵司在线| 欧美亚洲午夜视频在线观看| 久久精品一二三| 亚洲电影中文字幕| 亚洲视频 欧洲视频| 久久精品盗摄| 欧美精品1区2区| 国产精品一级二级三级| 一区视频在线| 亚洲一区免费网站| 久久久久久久久岛国免费| 亚洲激情小视频| 欧美影院一区| 欧美日韩成人在线视频| 国产午夜一区二区三区| 亚洲人永久免费| 欧美一区二区三区在线| 欧美波霸影院| 亚洲欧美国产va在线影院| 欧美jjzz| 国产综合在线视频| 亚洲欧美综合精品久久成人| 亚洲第一久久影院| 欧美在线一区二区| 国产精品成av人在线视午夜片 | 一片黄亚洲嫩模| 午夜精品av| 欧美日韩免费观看中文| 伊人激情综合| 久久精品国产77777蜜臀| 亚洲精华国产欧美| 久久久久青草大香线综合精品| 欧美日韩亚洲一区| 亚洲人午夜精品免费| 蜜桃久久av一区| 久久精品国产一区二区三区| 国产日本欧美一区二区三区| 亚洲免费在线精品一区| 亚洲人精品午夜在线观看| 久久精品二区亚洲w码| 国产欧美激情| 亚洲欧美电影院| 一本色道久久88精品综合| 欧美精品18+| 日韩亚洲欧美一区| 欧美激情精品久久久久久久变态 | 亚洲小说春色综合另类电影| 欧美体内she精视频| 一本色道久久综合狠狠躁的推荐| 欧美本精品男人aⅴ天堂| 久久婷婷国产综合尤物精品| 国产一区二区三区高清| 欧美中日韩免费视频| 欧美一级播放| 精品不卡一区二区三区| 老妇喷水一区二区三区| 女人天堂亚洲aⅴ在线观看| 亚洲片国产一区一级在线观看| 欧美激情按摩| 欧美日韩另类字幕中文| 性欧美1819sex性高清| 欧美诱惑福利视频| 亚洲福利视频网站| 亚洲激情视频在线播放| 欧美午夜激情小视频| 欧美一区二区三区在| 久久九九精品| 亚洲精品在线免费观看视频| 99精品视频免费观看视频| 国产女人精品视频| 久久综合九色综合欧美狠狠| 欧美激情第1页| 欧美在线观看网址综合| 欧美阿v一级看视频| 亚洲一区在线观看视频 | 久久国产精品色婷婷| 久久米奇亚洲| 亚洲在线视频免费观看| 久久精品一区二区| 一区二区三区欧美在线| 久久超碰97人人做人人爱| 99在线|亚洲一区二区| 午夜视频在线观看一区| 欧美精品久久久久久久久久| 亚洲男人影院| 欧美大尺度在线| 性色av一区二区三区| 欧美成人免费大片| 久久国产日本精品| 欧美激情精品久久久久久| 久久xxxx| 欧美日韩视频专区在线播放 | 欧美一级午夜免费电影| 99re6这里只有精品视频在线观看| 亚洲午夜精品视频| 亚洲美女av电影| 久久久最新网址| 欧美亚洲网站| 欧美午夜a级限制福利片| 欧美成人一区二区在线| 国产精品亚洲综合| 一本一本久久a久久精品综合妖精| 亚洲高清不卡一区| 亚洲欧美日韩综合aⅴ视频| 亚洲免费观看高清完整版在线观看| 性欧美长视频| 午夜精品国产精品大乳美女| 欧美激情亚洲另类| 免费一级欧美片在线播放| 国产一区再线| 欧美一区二区三区视频免费| 欧美一区成人| 国产区精品视频| 亚洲欧美一区二区三区久久 | 亚洲国产精品热久久| 欧美亚洲视频| 久久精品理论片| 国产色产综合色产在线视频| 亚洲欧美电影在线观看| 亚洲影院一区| 国产精品尤物福利片在线观看| 一区二区三区视频免费在线观看 | 亚洲视频视频在线| 欧美日本韩国在线| 亚洲三级电影全部在线观看高清| 亚洲电影在线| 欧美激情一区二区三区在线视频| 欧美大片第1页| 亚洲精品中文在线| 欧美日韩蜜桃| 亚洲欧美国产不卡| 久久九九精品| 伊人狠狠色j香婷婷综合| 久久久久久久久久久成人| 欧美韩国日本综合| 这里只有精品视频在线| 国产精品美女久久久久久免费| 在线亚洲激情| 久久精品噜噜噜成人av农村| 亚洲福利视频网| 欧美视频久久| 久久久久久精| 亚洲精品视频一区| 欧美怡红院视频| 亚洲国产一区二区在线| 亚洲精品欧美专区| 亚洲欧美一区二区在线观看| 国产一区免费视频| 免费亚洲电影| 亚洲一级黄色| 欧美高清视频在线 | 欧美成人免费在线观看| 亚洲精品中文字幕有码专区| 欧美视频在线看| 欧美一区二区精品在线| 欧美激情亚洲激情| 亚洲视频在线观看免费| 国产原创一区二区| 欧美精品日韩一本| 午夜精品成人在线| 欧美激情小视频| 香蕉久久国产| 亚洲人成网站777色婷婷| 欧美系列一区| 免费成人性网站| 午夜精品久久久久久久男人的天堂| 欧美成人午夜剧场免费观看| 亚洲欧美卡通另类91av| 亚洲韩国青草视频| 国产视频精品免费播放| 欧美精品一区二区三区视频| 午夜视频一区二区| 亚洲图片欧美一区| 亚洲欧洲日产国产综合网| 欧美中文在线观看| 亚洲欧美日韩综合一区| 日韩亚洲欧美一区二区三区| 亚洲大胆女人| 激情成人综合| 国产精品久久久久婷婷| 欧美人成网站| 欧美久久电影|