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中文網其他相關文章!