首頁 > 後端開發 > C++ > `std::function` 如何管理記憶體和可呼叫物件?

`std::function` 如何管理記憶體和可呼叫物件?

Patricia Arquette
發布: 2024-12-01 02:51:17
原創
822 人瀏覽過

How Does `std::function` Manage Memory and Callable Objects?

std::function:實作和記憶體管理

std::function 類別充當可呼叫物件的通用包裝器,使任何可調用類型的儲存和調用。雖然 lambda 表達式通常被實作為具有函數呼叫運算子的類,但它們的大小可能會根據引用變數的數量而顯著變化。

相反,std::function 必須保持固定的大小,同時容納各種類型的可呼叫對象,包括 lambda。它的實作依賴於類型擦除,這涉及建立表示可呼叫實體的基類。對於與 std::function 一起使用的每個特定可呼叫類型,都會動態建立並實例化衍生類別。

例如,考慮用於 double 到 int 函數的 std::function 的簡化實作:

struct callable_base {
   virtual int operator()(double d) = 0;
   virtual ~callable_base() {}
};
template<typename F>
struct callable : callable_base {
   F functor;
   callable(F functor) : functor(functor) {}
   int operator()(double d) { return functor(d); }
};
登入後複製

std::function 物件將包含基底類別的 unique_ptr。當使用特定的可呼叫函式建構 std::function 時,會在堆疊上建立並實例化衍生類別。 std::function 物件本身保持固定大小,而可呼叫物件的記憶體是動態分配的。

關於複製語意,每個 std::function 物件都維護自己的可呼叫實體的副本。從以下測試中可以明顯看出這一點:

fun f1 = [=]() mutable { std::cout << value++ << '\n' };
fun f2 = f1;
f1();
f2();
f3();
登入後複製

程式的輸出顯示 f2 和 f3 各自維護單獨的可調用對象,從而導致列印不同的遞增值。因此,std::function 為其可呼叫物件管理內存,同時確保 std::function 物件的副本維護自己獨立的可呼叫實體。

以上是`std::function` 如何管理記憶體和可呼叫物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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