首頁 > 後端開發 > C++ > std::function 與函數指標:什麼時候應該選擇每個?

std::function 與函數指標:什麼時候應該選擇每個?

Linda Hamilton
發布: 2024-11-11 05:24:03
原創
224 人瀏覽過

std::function vs. Function Pointer: When Should You Choose Each?

C 中的std::function 與函數指標:做出最佳選擇

在C 中,實現回呼函數時,經常實現回調函數時,經常實現會選擇出現在使用C 風格函數指標或std::function 之間。兩種方法各有優缺點,但在大多數情況下,std::function 是更好的選擇。

函數指針:有限功能

函數指針,如圖所示透過以下程式碼,有一個基本限制:

void (*callbackFunc)(int);
登入後複製

它們無法捕獲上下文變量,因此無法傳遞依賴此類變數的lambda 函數或呼叫非靜態物件資料成員。

std::function:通用且高效

相較之下,std::function (在C 11 中引入)允許儲存和使用任意類型的函數。它具有以下優點:

  • 上下文變數擷取:Lambda 函數和非靜態物件資料成員可以作為回調傳遞。
  • 否儲存開銷: std::function 旨在儲存回調,這在將它們儲存在類別中時可能很有用
  • 函數呼叫中的微小開銷: std::function 在函數呼叫中產生少量開銷,但在大多數情況下可以忽略不計。
  • 可讀方便: std::function 促進程式碼的一致性和可讀性,最大限度地減少仔細的需要

模板參數:替代方案

在某些情況下,使用範本參數作為可呼叫物件可以是有利。它允許任何可呼叫物件(函數指標、函子、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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板