首頁 > 後端開發 > C++ > 主體

std::function 與函式指標:什麼時候應該在 C 中選擇每個函式?

Susan Sarandon
發布: 2024-11-12 07:38:01
原創
520 人瀏覽過

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

C 中的 std::function 與函數指標:選擇哪一個以及何時選擇?

當涉及在 C 中定義回呼函數時,您有兩個主要選項:C 風格函數指標和 std::function。這種選擇可以顯著影響程式碼的功能和效率。

C 風格函數指標

函數指標已經存在很長時間並且仍然被廣泛使用。它們提供了儲存指向函數的指標的簡單性:

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

但是,它們有一個顯著的限制:

缺乏上下文擷取:函數指標不能保留父函數的上下文(例如,捕獲的變數)。這意味著您無法輕鬆傳遞 lambda 函數或呼叫物件的成員函數作為回呼。

std::function

std::function (在 C 11 中引入)是旨在克服這些限制。它提供了一種類型安全、通用的方式來儲存和傳遞函數:

std::function< void(int) > callbackFunc;
登入後複製

std::function 的優點:

  • Context Capture:std::function 可以捕捉父函數的上下文,從而可以使用lambda或成員函數指標。
  • 儲存:std::function 可以儲存在資料成員中,使其適合回調註冊和持久函數儲存。
  • 通用相容性:它適用於所有可調用對象,包括函數指針、函子和lambdas.

std::function的缺點:

  • 呼叫開銷:呼叫 std::function 會產生輕微的開銷與直接函數相比的效能開銷呼叫。
  • 非內聯:預設情況下,對 std::function 的呼叫不是內聯的,與直接函數呼叫不同。

範本參數

第三個選項,特別適合小型函數,是使用可呼叫物件的範本參數t ype:

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}
登入後複製

模板參數的優點:

  • 內聯:對回呼函數的呼叫是內聯的,增強性能.
  • 上下文捕獲:允許將上下文捕獲為

模板參數的缺點:

  • 標頭實作要求:包含範本參數的函數必須是在標頭中實作以支援完整型別資訊。

總表

總而言之,下表概述了這些選項之間的主要區別:

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

大多數情況下,除非您對函數指標或範本參數有特定要求,std::function 是首選,因為它具有靈活性、上下文擷取功能和通用相容性。

以上是std::function 與函式指標:什麼時候應該在 C 中選擇每個函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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