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

weibing

隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害”

VC中有一個(gè)關(guān)鍵字__declspec(dllexport), 其目的很簡(jiǎn)單,就是導(dǎo)出符號(hào),供其它可執(zhí)行模塊使用,主要用于動(dòng)態(tài)鏈接庫(kù)(DLL), 然而也可用于EXE模塊

與此相對(duì)應(yīng),__declspec(dllimport), 將指明由動(dòng)態(tài)鏈接庫(kù)導(dǎo)入符號(hào),除了導(dǎo)入全局變量/類的靜態(tài)成員變量,很多時(shí)候可以忽略, 這個(gè)時(shí)候?qū)ふ曳?hào)的優(yōu)先級(jí)將有所不同
 

當(dāng)這兩個(gè)關(guān)鍵字配合類使用,將會(huì)產(chǎn)生比較尷尬的問(wèn)題了

 

DLL:

struct __declspec(dllexport) A

{

    void TestInline()

{

    printf(from dll\n);

}

};

 

EXE:

struct __declspec(dllimport) A

{

void TestInline()

{

printf(from exe\n);

}

};

 

int main()

{

    A obj;

    obj.TestInline(); //輸出 from dll!

 

    return 0;

}

 

危害1:

A中的內(nèi)聯(lián)函數(shù)全部失效

 

這當(dāng)然可以從符號(hào)鏈接表中發(fā)現(xiàn)鏈接符號(hào)的蹤跡來(lái)表明內(nèi)聯(lián)函數(shù)失效了,不過(guò)有一個(gè)更簡(jiǎn)單的方法,我們可以在EXE的代碼中把TestInline內(nèi)聯(lián)函數(shù)的定義代碼加以簡(jiǎn)單修改,讓其輸出其它的字符串測(cè)試,這個(gè)時(shí)候運(yùn)行會(huì)發(fā)現(xiàn),輸出的字符串仍然是from dll(注意編譯為Release發(fā)行版, DEBUG版會(huì)將內(nèi)聯(lián)函數(shù)作為普通函數(shù)處理), 這就說(shuō)明了,內(nèi)聯(lián)函數(shù)被完全忽略了。如果這個(gè)時(shí)候,還能想到TestInline的定義代碼還有什么作用的話,那就是白白消耗編譯的時(shí)間,編譯期間編譯器辛辛苦苦生成的代碼,鏈接器會(huì)毫不留情地忽略掉。

 

很顯然,忽略掉內(nèi)聯(lián)函數(shù)的代碼,會(huì)有一個(gè)直接的副作用,那就是使應(yīng)用程序的運(yùn)行期變緩慢,特別是內(nèi)聯(lián)函數(shù)被大量在循環(huán)內(nèi)調(diào)用,而這個(gè)內(nèi)聯(lián)當(dāng)成普通函數(shù)處理了

 

C++運(yùn)行庫(kù)中有大量的內(nèi)聯(lián)成員函數(shù),除了模板類以外(當(dāng)然,非完全特化的模板類不可能支持導(dǎo)出的),基本上都是以導(dǎo)出類的形式導(dǎo)出,這樣也就意味著,動(dòng)態(tài)鏈接C++運(yùn)行庫(kù)的程序,這類內(nèi)聯(lián)函數(shù)全部失效,編譯時(shí)間可一點(diǎn)沒(méi)少。

 

危害2:

私有成員函數(shù),以及原本不想導(dǎo)出的函數(shù)(沒(méi)有多少重用價(jià)值,導(dǎo)出后還要承擔(dān)維護(hù)版本兼容性的責(zé)任),也被”不知不覺(jué)”
地導(dǎo)出了,對(duì)于私有(private)成員函數(shù), 導(dǎo)出到外面有什么用呢?占據(jù)了符號(hào)表的一個(gè)位置,可是誰(shuí)又能調(diào)用到呢?
如果要想調(diào)用,看來(lái)要強(qiáng)制把private變?yōu)閜ublic了,但是VC的符號(hào)形成機(jī)制包含了public/private/protected,
也就是通過(guò)了編譯也無(wú)法通過(guò)鏈接,唯一可能的辦法就是,修改DLL頭文件,在類里面增加”friend”, 在EXE端,
改變共享庫(kù)DLL頭文件的辦法,很顯然不是個(gè)正規(guī)方案

另外,導(dǎo)出了這些“無(wú)法調(diào)用”的函數(shù),也影響了鏈接器的優(yōu)化。對(duì)于這些函數(shù),如果DLL模塊內(nèi)部也沒(méi)有調(diào)用到,
本可以完全把這些代碼優(yōu)化掉,但是由于導(dǎo)出,鏈接器將無(wú)能為力, 這也直接增加了DLL文件的體積

由此想到的:

MFC/ATL動(dòng)態(tài)庫(kù)似乎了解到這個(gè)問(wèn)題,所以,它們寧可一個(gè)一個(gè)成員函數(shù)進(jìn)行符號(hào)導(dǎo)出,也沒(méi)有進(jìn)行整個(gè)類的導(dǎo)出,
為什么它們不把這個(gè)方式推薦給VC動(dòng)態(tài)運(yùn)行庫(kù)呢?

VC傳統(tǒng)靜態(tài)鏈接運(yùn)行庫(kù)的方式雖然有某種弊端,但是卻可以完全避開(kāi)上述提到的問(wèn)題,而且脫離了版本型DLL的依賴(MSVCR71.dll, MSVCP71.dll, MSVCR90.dll, MSVCP90.dll), 對(duì)于這類DLL的依賴,將給以后程序升級(jí)帶來(lái)隱含并難以解決的問(wèn)題,大家可以考慮如下情形

版本1:A.exe依賴于B.dll, 并且它們同時(shí)依賴于msvcp71.dll

版本2: 由于A采用了新的VC版本進(jìn)行編譯,A.exe現(xiàn)在依賴于msvcp90.dll了,B.dll沒(méi)有升級(jí),仍然依賴msvcp71.dll

這個(gè)時(shí)候,進(jìn)程中的內(nèi)存結(jié)構(gòu)產(chǎn)生了微妙的變化,舉例來(lái)說(shuō),原來(lái)msvcp71.dll中的全局變量(例如cout)同時(shí)被A.exe和B.dll使用?,F(xiàn)在呢,A.exe使用的是msvcp90.dll中的cout, B.dll使用的還是msvcp71.dll中的cout, 這種耦合的變化,將會(huì)導(dǎo)致程序執(zhí)行邏輯的變化(如果你運(yùn)氣好,也許會(huì)沒(méi)有問(wèn)題的),例如,如果你在A中設(shè)置了cout的格式,然后調(diào)用B的接口,最后B的接口通過(guò)cout輸出,版本2與版本1將會(huì)拿到不同的執(zhí)行效果(源代碼可一點(diǎn)沒(méi)變哦,僅僅是換了個(gè)編譯器編譯)。大型程序邏輯將是非常復(fù)雜的,看來(lái)還是不要升級(jí)編譯器進(jìn)行編譯的好,因?yàn)檫@將導(dǎo)致dll依賴關(guān)系的變化,這真是個(gè)無(wú)奈的選擇

 

混合編譯選項(xiàng) /clr看來(lái)要考慮允許靜態(tài)鏈接運(yùn)行庫(kù)了(現(xiàn)在的VC版本只能動(dòng)態(tài)鏈接運(yùn)行庫(kù)的),因?yàn)檫\(yùn)行庫(kù)DLL存在版本和效率缺陷

 

大家有沒(méi)有發(fā)現(xiàn)LINUX操作系統(tǒng)下的so文件一般比windows下的要大很多,其中一個(gè)原因是這個(gè)模型相當(dāng)于默認(rèn)全部導(dǎo)出,即使是全局函數(shù)也是一樣,哪怕你臨時(shí)寫一個(gè)沒(méi)意義的函數(shù),忘記去掉了,也一并導(dǎo)出,雖然你并沒(méi)有給外界頭文件,告訴這個(gè)接口如何被調(diào)用,但是這個(gè)接口已經(jīng)事實(shí)存在了。雖然這樣會(huì)簡(jiǎn)化一些工作,但是個(gè)人覺(jué)得,是非常不負(fù)責(zé)任的,特別是現(xiàn)代的應(yīng)用大都是多任務(wù)模塊化的,這樣做潛在地多吃掉不少內(nèi)存和硬盤,而且對(duì)于版本兼容性,將帶來(lái)麻煩。我對(duì)LINUX了解不多,不知道是否有支持指定導(dǎo)出函數(shù)的方法呢?

COM(Component Object Model), 也許有很多其它弊端,但卻解決了上述問(wèn)題,而且可以拿掉DLL文件名中描述版本的丑陋數(shù)字

 

個(gè)人認(rèn)為,發(fā)展C++的二進(jìn)制接口標(biāo)準(zhǔn)ABI(Application Binary Interface)是非常重要的,COM應(yīng)該算一個(gè)ABI標(biāo)準(zhǔn)吧??偸庆o態(tài)地依賴源代碼作為可重用模塊,真的弊端很大,多任務(wù)時(shí)占用的磁盤和內(nèi)存也會(huì)增加。托管編程模型毫無(wú)疑問(wèn)解決了這個(gè)問(wèn)題,當(dāng)然也帶來(lái)了其它方面的一些問(wèn)題。C++在編程模型上可以說(shuō)比托管編程模型要簡(jiǎn)單很多,但缺少一個(gè)二進(jìn)制標(biāo)準(zhǔn)。解決這個(gè)問(wèn)題將比在語(yǔ)言層面增加幾個(gè)關(guān)鍵字要重要很多

posted on 2011-08-01 23:54 魏兵 閱讀(3690) 評(píng)論(13)  編輯 收藏 引用

Feedback

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-02 02:35 fklz

暈死,顯然是你傻逼不會(huì)用!真沒(méi)見(jiàn)過(guò)這么傻逼還自作聰明的  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-02 14:47 Enic

樓上非常正確,,,  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-02 16:24 樂(lè)購(gòu)網(wǎng)

來(lái)好好的學(xué)習(xí)一下。  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-02 18:46 空明流轉(zhuǎn)

你用啥沒(méi)危害。。。  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-02 19:44 bennycen

看成了“人類的嚴(yán)重危害”  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害”[未登錄](méi) 2011-08-03 09:19 劍孤寒

首先,內(nèi)聯(lián)函數(shù)全部失效并不是導(dǎo)出類的錯(cuò),而是用的人的錯(cuò),如果你要內(nèi)聯(lián)就不應(yīng)該用導(dǎo)出類
其次,私有函數(shù)導(dǎo)出并不會(huì)顯著增加dll體積,如果dll體積很重要也是有辦法回避這個(gè)問(wèn)題的,另外,私有函數(shù)導(dǎo)不導(dǎo)出跟維護(hù)沒(méi)啥關(guān)系吧,都是你內(nèi)部用的,你不用導(dǎo)出類內(nèi)部函數(shù)出問(wèn)題還不是也要維護(hù)
最后,靜態(tài)鏈接庫(kù)如果用了stl也是依賴crt的  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-03 10:09 cr

不是這么用的。  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-03 10:48 terminator

傻逼成這樣居然還能長(zhǎng)篇大論?夠寒磣人的。  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害”[未登錄](méi) 2011-08-03 19:54 cexer

那些出口就罵人的,都是些畜牲嗎?你爹媽沒(méi)教過(guò)你怎么說(shuō)人話?  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害”[未登錄](méi) 2011-08-04 04:37 cexer

搞笑啊,樓上你冒用ID很光彩?看來(lái)被人罵傻逼沒(méi)罵錯(cuò)  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害”[未登錄](méi) 2011-08-04 09:11 a

人家理解的不對(duì),大家指出問(wèn)題、提供解決辦法就行,何必罵人呢?罵完了對(duì)你有什么好處啊。朋友多了路好走。樹個(gè)敵人對(duì)自己有益處?年輕人怎么這么多火焰呢?這么有活力,還不如去改造這個(gè)社會(huì)做貢獻(xiàn)呢。在團(tuán)隊(duì)方面來(lái)講,罵人首先就沒(méi)有團(tuán)隊(duì)精神,不合作啊。  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-05 13:07 欲三更

1.按照l(shuí)z的邏輯,F(xiàn)22戰(zhàn)機(jī)的嚴(yán)重危害是它們太費(fèi)油——你都使用導(dǎo)出類了,還在乎什么內(nèi)聯(lián)函數(shù)?

2.stl代碼里面什么時(shí)候有導(dǎo)出類的符號(hào)了?VC的crt說(shuō)的是C庫(kù)。

3.這個(gè)時(shí)候,進(jìn)程中的內(nèi)存結(jié)構(gòu)產(chǎn)生了微妙的變化……以我的經(jīng)驗(yàn),任何一個(gè)頭腦正常的工程師都不會(huì)做這樣的事情!

4.現(xiàn)在談COM之類的東西,我怎么感覺(jué)這是5年前的文章?  回復(fù)  更多評(píng)論   

# re: 隨想Visual C++ “導(dǎo)出/導(dǎo)入類的嚴(yán)重危害” 2011-08-05 20:00 fly C++

@劍孤寒
這個(gè)問(wèn)題我深入考察過(guò)MFC動(dòng)態(tài)庫(kù)與CRT動(dòng)態(tài)庫(kù)的不同,發(fā)現(xiàn)MFC頭文件中的內(nèi)聯(lián)成員函數(shù)是有效的(這可以通過(guò)簡(jiǎn)單修改頭文件中的定義代碼,看運(yùn)行時(shí)的效果可以證明,你修改的代碼產(chǎn)生作用,就說(shuō)明并沒(méi)有用到DLL內(nèi)部的定義),其原因是MFC的頭文件并沒(méi)有使用戶通過(guò)__declspec(dllimport) class 的方式使用,但是CRT動(dòng)態(tài)庫(kù),卻是隱含的讓使用者采用這種方式,其結(jié)果是,當(dāng)用戶動(dòng)態(tài)鏈接CRT時(shí),其非模板類內(nèi)聯(lián)成員函數(shù)(模板類不能真正導(dǎo)出定義),實(shí)際上都不可能作為內(nèi)聯(lián)函數(shù)了,因?yàn)槭褂玫亩际荄LL內(nèi)部的定義代碼(這也可以通過(guò)上面的方法發(fā)現(xiàn)),這將一定程度上影響程序執(zhí)行效率,并使CRT導(dǎo)出接口龐大(內(nèi)聯(lián)函數(shù)導(dǎo)出沒(méi)有意義,因?yàn)楸┞兜念^文件已經(jīng)有定義代碼了,為什么還要使用DLL的定義體呢,而且會(huì)傷害運(yùn)行效率)。我碰到過(guò)一個(gè)程序,靜態(tài)鏈接CRT比動(dòng)態(tài)鏈接CRT要快非常多,并不是程序加載DLL產(chǎn)生的時(shí)間延遲,而是程序運(yùn)行起來(lái)之后產(chǎn)生的問(wèn)題,花了非常多的時(shí)間,才確定是這個(gè)原因。如果大家有興趣,我可以貼出一段代碼

關(guān)于接口維護(hù), 對(duì)于C語(yǔ)言寫的DLL, 只是導(dǎo)出一部分外界需要用到的函數(shù),如果C++導(dǎo)出了所有內(nèi)部定義的東西,不管外界是否要用到,而且私有成員函數(shù)對(duì)于外界也不可能用到,多少感覺(jué)有些那個(gè)

以上謹(jǐn)代表個(gè)人觀點(diǎn)的  回復(fù)  更多評(píng)論   


My Links

Blog Stats

常用鏈接

留言簿

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区的| 久久免费视频观看| 国产精品羞羞答答| 欧美特黄视频| 国产精品久久久久aaaa| 国产精品成人免费视频| 国产精品日韩一区二区| 国产亚洲欧美日韩美女| 韩国三级在线一区| 亚洲精品国精品久久99热一| 亚洲日产国产精品| 亚洲视频在线一区| 欧美伊人久久| 欧美h视频在线| 亚洲狼人综合| 欧美一区二区三区啪啪| 另类av一区二区| 欧美日韩妖精视频| 国产一区二区三区视频在线观看| 尤物精品在线| 亚洲网站视频| 久久久久久夜| 亚洲日本成人网| 中文欧美日韩| 免费看亚洲片| 国产农村妇女精品一区二区 | 欧美午夜宅男影院在线观看| 国产伦精品一区二区三区免费迷| 黄色免费成人| 午夜精品福利在线观看| 欧美丰满高潮xxxx喷水动漫| 亚洲一区在线免费| 欧美噜噜久久久xxx| 影音先锋久久资源网| 亚洲欧美另类中文字幕| 亚洲国产日韩欧美| 久久精品国产96久久久香蕉| 欧美日韩高清不卡| 亚洲国产婷婷| 久久综合色一综合色88| 亚洲一区在线观看视频| 欧美视频不卡| 亚洲美女网站| 欧美国产视频日韩| 久久精品91久久香蕉加勒比| 国产精品免费看片| 亚洲少妇一区| 亚洲免费观看高清完整版在线观看熊| 久久亚洲二区| 亚洲国产欧美精品| 免费在线观看日韩欧美| 久久大香伊蕉在人线观看热2| 国产精品护士白丝一区av| 日韩视频中文| 亚洲韩国精品一区| 欧美日韩国产黄| 99在线精品观看| 国产一区日韩二区欧美三区| 国产精品美女| 国产精品99久久久久久人| 亚洲人成亚洲人成在线观看图片| 久久久精品午夜少妇| 精品不卡视频| 欧美第一黄网免费网站| 久久视频这里只有精品| 影音先锋日韩有码| 欧美黑人国产人伦爽爽爽| 免费欧美电影| 亚洲伊人网站| 欧美一区二区三区在线看| 狠狠色噜噜狠狠狠狠色吗综合| 久久资源在线| 欧美黑人在线播放| 亚洲一区二区四区| 欧美一区二区三区在线免费观看| 在线电影欧美日韩一区二区私密| 亚洲成色999久久网站| 欧美日本国产视频| 亚洲免费在线观看| 久久激情婷婷| 999亚洲国产精| 亚洲一区二区三区在线观看视频| 国产麻豆91精品| 久久一区亚洲| 欧美日韩高清免费| 久久久91精品国产一区二区精品| 久久久99国产精品免费| 亚洲国产婷婷香蕉久久久久久99| 欧美激情久久久久| 国产精品美女主播| 亚洲大胆人体在线| 国产精品视频第一区| 免费日韩成人| 欧美视频中文字幕| 久久综合给合| 欧美日韩精品系列| 久久久午夜电影| 欧美日韩国产综合一区二区| 久久成人av少妇免费| 欧美成人一区二免费视频软件| 午夜国产精品影院在线观看| 亚洲一区二区三区四区视频| 久久国产成人| 亚洲一区二区黄| 你懂的国产精品| 久久精品盗摄| 欧美午夜视频在线| 欧美激情麻豆| 伊人成年综合电影网| 亚洲视频在线二区| 亚洲精品国产欧美| 久久久久免费视频| 欧美在线日韩精品| 欧美午夜不卡影院在线观看完整版免费| 久久久久久久综合色一本| 欧美日韩一区在线观看视频| 欧美.日韩.国产.一区.二区| 国产欧美日韩一区二区三区在线 | 亚洲欧美视频一区| 欧美一区二区在线免费播放| 亚洲私人黄色宅男| 欧美国产日韩精品免费观看| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品老牛| 一区二区三区四区五区视频| 亚洲伦理中文字幕| 欧美sm视频| 欧美大片一区二区三区| 国产自产高清不卡| 欧美在线999| 久久久亚洲人| 黑丝一区二区三区| 久久久999精品| 国产嫩草影院久久久久 | 久久国产一区二区| 国产精品爽黄69| 亚洲影视九九影院在线观看| 亚洲视频日本| 欧美午夜视频在线| 亚洲欧美日韩精品久久久| 午夜精品久久久久| 国产日韩久久| 久久久久久噜噜噜久久久精品| 久久久久久电影| 一区二区三区自拍| 蜜桃久久精品乱码一区二区| 欧美激情视频一区二区三区免费| 亚洲电影第三页| 欧美肥婆在线| 夜夜嗨av色一区二区不卡| 亚洲一区二区免费视频| 国产精品一级二级三级| 欧美一区免费视频| 欧美激情亚洲激情| 中文亚洲免费| 国产三区精品| 久热精品视频| 一本不卡影院| 久久亚洲国产精品一区二区| 久久精品国产91精品亚洲| 蜜桃av噜噜一区| 一区二区三区**美女毛片| 国产精品分类| 久久久综合激的五月天| 亚洲精品午夜| 久久国产夜色精品鲁鲁99| 亚洲国产另类 国产精品国产免费| 欧美连裤袜在线视频| 亚洲综合第一| 亚洲高清免费在线| 欧美一级片久久久久久久| 在线播放豆国产99亚洲| 欧美三级电影大全| 久久久久久亚洲综合影院红桃| 亚洲日本成人在线观看| 久久久久88色偷偷免费| 日韩天堂av| 韩国欧美一区| 国产精品第一页第二页第三页| 久久久久国产精品麻豆ai换脸| 亚洲美洲欧洲综合国产一区| 久久精品国产v日韩v亚洲| 夜夜夜久久久| 精品动漫3d一区二区三区| 亚洲欧洲一区二区在线播放 | 午夜视频久久久| 国产日韩欧美日韩大片| 老司机午夜精品视频在线观看| 99精品免费视频| 免费一区视频| 久久精品视频免费| 在线综合欧美| 亚洲精品乱码久久久久久| 狠狠噜噜久久| 欧美黄色小视频| 久久久国产成人精品| 亚洲午夜伦理| 日韩午夜电影| 亚洲欧洲一区二区在线播放 | 欧美日本国产视频|