2009-10-06 71 views
18

我知道以下方法來C++代表:Fast C++代表

。與純虛函數接口
Boost.Function
The Fastest Possible C++ Delegates
The Impossibly Fast C++ Delegates
Fast C++ Delegates
Fast C++ Delegate: Boost.Function 'drop-in' replacement and multicast

每個人都有自己的優點和缺點。有些快,有些是比較靈活的,有些是功能更豐富,有些更符合標準的,有些是更便攜,但我個人發現自己喜歡的第三:謝爾蓋·梁贊諾夫的難以置信的快C++的代表。但問題是,他的代表不具有可比性:

我的代表無法進行比較。比較運算符未定義,因爲委託不包含指向方法的指針。指向存根函數的指針在各種編譯單元中可能會有所不同。

哪一個讀者都回答說:

「指向一個存根功能,可在不同的編譯單元的不同。」 AFAIK,這是不正確的。編譯器需要重新使用在不同編譯單元中生成的模板函數(這我確信 - 但我認爲Borland曾經違反了這個規則)。我認爲這是因爲類(不在'無名'命名空間中的)使用外部鏈接,並且使用存根函數的方式將始終阻止它們被內聯(儘管這不應該成爲一個問題,將強制生成一個非內聯版本,並且鏈接器執行的「外部鏈接」將消除除了一個類似命名的功能(它們假定並且要求與標準相同)之外的所有其他功能)...

如果你定義一個模板函數一個翻譯單元(cpp文件),然後在另一個翻譯單元中以不同的方式定義相同的功能,這兩個版本中只有一個將使其成爲最終的可執行文件。 (這實際上違反了「一個定義規則」,但是對GCC起作用,至少......不確定MSVC)。重點是:[stub]的地址在不同的單元中是相同的。

我促請你更新文章(包括比較能力),如果你覺得這對於MSVC的是真實的 - 如果MSVC的授予標準,在這方面。

現在的文章是四歲和筆者在過去的三年左右的時間並沒有回答任何的評論,所以我不知道是否有任何好處上述評論以及是否具體實際上可以改變以支持比較。 C++標準是否特別禁止這種使用,如果是這樣,那麼最近的編譯器在這方面實際上是否符合標準?

謝謝。

+1

即使該陳述是真實的,通過向其代表添加一個未使用的成員,可以輕鬆地添加可比性。 – MSalters 2009-10-07 12:08:33

回答

11

的代碼是既符合標準,並罰款。我沒有看到他違反ODR的任何地方,並且所有具有相同模板參數的函數模板的實例化應該具有「相同的地址」(從某種意義上說,指向函數的指針應該都是相等的),這是事實 - 如何這個實現並不重要。 ISO C++ 03 14.5.5.1 [temp.over.link]更詳細地描述了規則。

所以,比較完全可以有一個符合性和便攜的方式定義。

+0

如果模板實例駐留在不同的DLL中,該怎麼辦?或者一個在主應用程序中,另一個在不同的DLL中? – user1095108 2012-08-14 23:22:25

+0

該標準並沒有真正處理DLL /共享庫的概念。當然,實際上,由於它們是分別編譯和鏈接的,因此編譯器無法合併實例化。所以,是的,那將是一個難題。 – 2012-08-16 18:20:13