C 中的std::function 與函數指標:做出最佳選擇
在C 中,實現回呼函數時,經常實現回調函數時,經常實現會選擇出現在使用C 風格函數指標或std::function 之間。兩種方法各有優缺點,但在大多數情況下,std::function 是更好的選擇。
函數指針:有限功能
函數指針,如圖所示透過以下程式碼,有一個基本限制:
void (*callbackFunc)(int);
它們無法捕獲上下文變量,因此無法傳遞依賴此類變數的lambda 函數或呼叫非靜態物件資料成員。
std::function:通用且高效
相較之下,std::function (在C 11 中引入)允許儲存和使用任意類型的函數。它具有以下優點:
模板參數:替代方案
在某些情況下,使用範本參數作為可呼叫物件可以是有利。它允許任何可呼叫物件(函數指標、函子、lambda、std::function 等)作為參數傳遞。但是,也有一些缺點:
比較摘要
下表比較了每種方法的優點和缺點:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Context variable capture | No¹ | Yes | Yes |
Call overhead | No | No | Yes |
Inlining potential | No | No | Yes |
Class member storage | Yes | Yes | No² |
Header implementation | Yes | Yes | No |
C 11 support | Yes | No³ | Yes |
Readability | No | Yes | (Yes) |
結論
總之,std::function 通常是在 C 中實現回呼函數的建議選擇,它提供了多功能性、便利性和最小的開銷。函數指針對於特定需求仍然有用,例如無標頭實現或有嚴格的性能要求時。如果靈活性是優先考慮的,那麼將模板參數視為可調用物件可能是可行的選擇。
以上是std::function 與函數指標:什麼時候應該選擇每個?的詳細內容。更多資訊請關注PHP中文網其他相關文章!