2015-07-21 48 views
-1

我的一位同事最近表示在C++中使用外部庫有意義嗎?

C++完全基於模板。 DLL是一個C-leftover。所有類的95%都是模板,這就是爲什麼DLL沒有任何意義,並且不適合C++。

我有點理解他的論點,至少標準庫的大部分都是使用模板。另一方面,他的論點不僅適用於共享對象,而且適用於簡單的,靜態鏈接的檔案,所以他基本上說任何一種外部圖書館都是「C-剩餘」,這對我來說並不是真的。

雖然個人而言,我的大部分類都不是模板化的,即使在構建靜態庫或共享庫時,我也從未遇到過問題,即使它們有模板。

因此,最後,我的同事提出了一個很好的論點,還是相當無效? 此外,像boost這樣的庫如何管理模板?

+0

前提是錯誤的。我可以編寫不使用模板的C++程序。 –

+0

我使用類編寫程序,並且只有在保證模板的情況下才使用模板。很多時候不需要模板,特別是當只有一個類的實例時。 –

+0

DLL和共享對象在您需要使用它們或何時可以幫助您的程序時很有意義。告訴你的朋友開始閱讀書籍,並開展更廣泛的項目。繼續你的生活,並停止與你的朋友討論。 –

回答

1

我當然會說「我不完全同意這一點。」如果這是汽車行業,那麼你可以同樣說:「現在我們有塑料和碳纖維,你不需要金屬來製造汽車。當然,可以用塑料製造汽車(除發動機和輪軸等之外)。碳纖維,但同時它不是很實用,也不是「最佳選擇」(除非你正在經營一級方程式團隊,或在法拉利,保時捷等工作),所以期待福特,奧迪,雪佛蘭,菲亞特和斯柯達將繼續在汽車中使用大量鋼材 - 現在他們比5年前使用更多的塑料,而且超過50年前的時間 - 因爲這對現代機械和技術是正確的 - 但它並不意味着金屬「無用而且不再需要」

就像生活中的很多事情一樣,共享庫的使用(DLL是Windows術語,存在「.so」和其他OSe中的「.dynlib」 s)或不是一個簡單的「是或否」的問題,但是「這裏真的很有用」的滑動範圍「這裏實際上使你的生活變得困難和沒用」。

模板很適合解決一些問題,但對於大型項目,即使使用模板,WHOLE項目也不能(幾乎不能)重新編譯爲一個單元。查看諸如LLVM + Clang之類的項目,它們使用C++構建編譯器。是的,它在適當的地方使用模板,它使用沒有模板的類來處理其他事情。但這並不意味着你不需要分割項目(或從其他項目引入代碼)並使用共享庫,這絕對不是一個壞主意。

這真的取決於你想解決什麼問題,以及你如何解決這個問題。不是所有的東西都應該用C++中的模板來解決。當然,模板適用於某些類型的解決方案。其他問題對模板沒有意義。

我有我寫了一個Pascal編譯器,如果我搜索template,像這樣:

$ grep template *.cpp *.h 
expr.cpp:template<> 
stack.h:template <typename T> 
stack.h:template <typename T> 
stack.h:template<typename T> 

你可以看到,我的代碼不使用許多模板。這是否意味着你的同事不能使用模板幾乎完全編寫編譯器?可能不會。但對我而言,模板並不是我編譯器中大多數問題的自然解決方案。 C++不僅僅是一種模板語言,它的類和功能也沒有模板。話雖如此,我可能應該看看使用更多的模板代碼...我認爲有一些地方可以提煉...另外,如果我們有一個項目,您可以在其中創建幾個可執行文件,這些文件可以在相當大的程度上共享某些代碼(例如一個或多個GUI組件,數據庫接口,執行一些計算的數學邏輯, (複雜)文件格式等),使用共享庫是生成小型可執行文件的絕佳方式,而不是將該代碼的[大部分]複製到每個應用程序中。

1

是的,使用外部庫是有意義的,因爲否則你有靜態鏈接的可執行文件可能很大(> 100MB)!爲什麼要在每個可執行文件中靜態鏈接Win32.dll?這隻會導致重複代碼,佔用硬盤空間,在運行時佔用更多內存等。

外部庫(DLL)不是「C-leftover」。它們用於操作系統加載到內存中並由多個程序「共享」。而且由於它們已經加載到內存中,所以依賴於DLL的可執行文件可以加載得更快,因爲它不需要加載(> 100MB)到內存中!

我有點理解C++模板參數,因爲它們在編譯時被解析,並且一旦創建DLL就無法添加類型。 您可能只會使用少數類型,所以如果您確實需要DLL,那麼只需創建一個「少數」或不要使用DLL入口點的模板!

+1

如果您編寫模板「template my_vector_clone」,並且您希望通過編譯庫(例如DLL)共享該模板,則可以執行此操作。容易。但只有當你願意提前決定要分享的特定子集時。也許'my_vector_clone '和'my_vector_clone '和'my_vector_clone '。只是明確地將這三個實例化在正確的位置,一切都會好起來的 –

+0

是的,這就是我的意思是「少數」。 –

+0

你解釋我的最後一段比我更好。 –

0

你的同事不明白dll可能是「不要重複你自己」的最好例子之一。 DLL節省時間和空間。

Whatcha會做什麼,回到恐龍時代試圖找出如何實現平方根只有異或?我很確定,我們都可以同意使用別人經過時間考驗的代碼通常比使用自己的代碼更好。

此外,模板和DLL似乎沒有太多關係。是的,在某些情況下模板可能會很糟糕(特別是模板元編程),但我認爲我們大多數人不明白他來自哪裏以及爲什麼。

0

您提出的陳述是毫無意義的。沒有。零。壓縮。

DLL-s與C無關。它們是Windoze的發明。或者說,之前的多用戶系統中存在的共享庫概念的Windoze版本(後來進入Unix)。

相關問題