2013-11-21 141 views
1

考慮到一個指向函數的指針返回另一個指向另一個函數的指針是C中用來引入一些運行時多態/回調的機制,實現這個的等效方式是什麼在C++中,同時改善局部性並降低關於指針和間接指向的成本?函數指針在C++中返回另一個函數指針與地方

例如this syntactic sugar可以幫助,但我並不是真的對此感興趣,儘管這是一種以C++方式而不是更多C-ish做事情的好方法,我更感興趣的是在嘗試改進本地減少運行時顯式指針的使用。

+0

你想做什麼?向我們展示這樣做的舊方法(代碼)。我們不能根據猜測來改進事物。 – user694733

+0

@ user694733我沒有添加任何具體的例子,因爲這會使討論極化,我不期待任何其他用戶的代碼片段,這個問題更多的是關於設計和性能,而不是實際的代碼。 – user2485710

+0

性能總是與特定應用程序相關聯。沒有通用指南:*「做X並且總是會更快」*。對於你的問題虛擬功能似乎要走的路。根據我的經驗,他們提供的靈活性一直是比可忽略的性能成本更大的因素。如果你想改善分支預測等事情,你需要首先顯示確切的問題,因爲答案將取決於此。 – user694733

回答

3

關於爲什麼人們在C中使用函數指針來模擬多態性的真正原因不是性能,而是C既不支持真正的多態性也不支持模板的事實。這是你在C++中的兩種選擇。所有三種方法在this thread進行比較。

請注意,即使調用函數指針不需要虛函數調用執行的附加vtable查找,調用虛函數和函數指針也會遇到同樣的主要性能問題:兩種情況下的分支預測都不可靠,你傾向於結束更多的管道沖洗。

+0

這就是我想要做的,我試圖幫助CPU與地方。 – user2485710

+0

正如[鏈接的線程](http://stackoverflow.com/questions/1955074/virtual-methods-or-function-pointers)中指出的那樣,您可以通過使用模板獲得最佳性能。但在大多數情況下,它不值得從中產生不利之處。關於使用模板最糟糕的是[隱藏的編譯器錯誤](http://programmers.stackexchange.com/questions/70086/why-are-c-template-error-messages-so-horrific)。 – Domi

0

我認爲你可以使用虛擬功能來滿足部分要求。

+0

我想避免這一點,原則上,我也想通過設計來避免虛擬功能。 – user2485710