第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何安全地將對象(特別是STL對象)傳遞給DLL?

如何安全地將對象(特別是STL對象)傳遞給DLL?

慕姐8265434 2019-07-16 18:07:47
如何安全地將對象(特別是STL對象)傳遞給DLL?如何將類對象(特別是STL對象)傳遞給C+DLL?我的應(yīng)用程序必須以dll文件的形式與第三方插件交互,而且我無法控制這些插件是用什么編譯器構(gòu)建的。我知道對于STL對象沒有保證的ABI,我擔(dān)心在我的應(yīng)用程序中造成不穩(wěn)定。
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

編寫了一個很好的解釋,解釋了為什么在一般情況下,ABI的缺乏會阻止C+對象跨越DLL邊界,即使類型定義處于用戶控制之下,并且在兩個程序中都使用完全相同的令牌序列。(有兩種情況是可行的:標(biāo)準(zhǔn)布局類和純接口)

對于在C+標(biāo)準(zhǔn)中定義的對象類型(包括那些來自標(biāo)準(zhǔn)模板庫的對象類型),情況要糟糕得多。定義這些類型的令牌在多個編譯器中并不相同,因為C+標(biāo)準(zhǔn)沒有提供完整的類型定義,只提供最低要求。此外,出現(xiàn)在這些類型定義中的標(biāo)識符的名稱查找不會解決相同的問題。即使在存在C+ABI的系統(tǒng)上,試圖跨模塊邊界共享此類類型也會由于一個定義規(guī)則的違反而導(dǎo)致大量未定義的行為。

這是Linux程序員不習(xí)慣處理的事情,因為g+的libstdc+實際上是一個標(biāo)準(zhǔn),幾乎所有的程序都使用它,從而滿足了ODR.clang的libc+打破了這個假設(shè),然后C+11伴隨著幾乎所有標(biāo)準(zhǔn)庫類型的強制性更改。

只是不要在模塊之間共享標(biāo)準(zhǔn)庫類型。這是不確定的行為。


查看完整回答
反對 回復(fù) 2019-07-16
?
繁花如伊

TA貢獻2012條經(jīng)驗 獲得超12個贊

這里的一些答案使得通過C+類聽起來真的很可怕,但我想分享另一個觀點。其他一些響應(yīng)中提到的純虛擬C+方法實際上比您想象的要干凈。我已經(jīng)圍繞這個概念建立了一個完整的插件系統(tǒng),它已經(jīng)運行了很多年了。我有一個“PluginManager”類,它使用LoadLib()和GetProcAddress()動態(tài)地從指定的目錄加載dll(以及Linux等效文件,以便跨平臺執(zhí)行)。

信不信由你,即使您做了一些奇怪的事情,比如在純虛擬界面的末尾添加一個新函數(shù),并嘗試在沒有新函數(shù)的情況下加載針對接口編譯的dll,這種方法也是可以原諒的-它們會加載得很好。當(dāng)然.。您必須檢查版本號,以確保您的可執(zhí)行文件只對實現(xiàn)該函數(shù)的較新的dll調(diào)用新函數(shù)。但好消息是:它有效!因此,在某種程度上,你有一個粗糙的方法來逐步發(fā)展你的界面。

關(guān)于純虛擬接口的另一件很酷的事情-你可以繼承你想要的多少接口,你永遠(yuǎn)不會遇到鉆石問題!

我想說,這種方法最大的缺點是,您必須非常小心您作為參數(shù)傳遞的類型。不首先用純虛擬接口包裝類或STL對象。沒有結(jié)構(gòu)(沒有經(jīng)過實用主義包裝巫毒)。只是原始類型和指向其他接口的指針。此外,您不能超載函數(shù),這是一個不便,但不是一個顯示停止。

好消息是,使用少量代碼行,您可以創(chuàng)建可重用的泛型類和接口來包裝STL字符串、向量和其他容器類。或者,您可以將函數(shù)添加到您的接口中,如GetCount()和GetVal(N),以便讓用戶遍歷列表。

人們?yōu)槲覀儤?gòu)建插件很容易。他們不必是ABI邊界方面的專家-他們只是繼承他們感興趣的接口,對他們支持的函數(shù)進行編碼,并為不支持的函數(shù)返回false。

據(jù)我所知,制造所有這些工作的技術(shù)并不是基于任何標(biāo)準(zhǔn)。據(jù)我所知,微軟決定這樣做他們的虛擬表,這樣他們就可以制作COM,而其他編譯器編寫人員也決定效仿。這包括GCC、Intel、Borland和其他大多數(shù)主要的C+編譯器。如果您計劃使用一個晦澀的嵌入式編譯器,那么這種方法可能不會適用于您。理論上說,任何一家編譯器公司都可以隨時改變他們的虛擬表并打破它們,但是考慮到多年來編寫的大量代碼依賴于這種技術(shù),如果任何主要的參與者決定打破排名,我會感到非常驚訝。

所以這個故事的寓意是.。除了一些極端的情況外,您需要一個負(fù)責(zé)接口的人,他可以確保ABI邊界與原始類型保持干凈,并避免重載。如果您同意這一規(guī)定,那么我就不怕在編譯器之間共享DLL/SOS中類的接口。直接共享類=麻煩,但共享純虛擬接口并不那么糟糕。


查看完整回答
反對 回復(fù) 2019-07-16
  • 3 回答
  • 0 關(guān)注
  • 695 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號