std::function: Pelaksanaan dan Pengurusan Memori
Kelas fungsi std:: berfungsi sebagai pembungkus generik untuk objek boleh dipanggil, membolehkan penyimpanan dan pemanggilan apa-apa jenis boleh dipanggil. Walaupun ungkapan lambda sering dilaksanakan sebagai kelas dengan operator panggilan fungsi, saiznya boleh berbeza-beza dengan ketara bergantung pada bilangan pembolehubah yang dirujuk.
Sebaliknya, fungsi std::mesti mengekalkan saiz tetap sambil menampung pelbagai jenis boleh panggil. , termasuk lambdas. Pelaksanaannya bergantung pada pemadaman jenis, yang melibatkan penciptaan kelas asas yang mewakili entiti boleh dipanggil. Untuk setiap jenis boleh panggil tertentu yang digunakan dengan std::function, kelas terbitan dicipta dan dibuat instantiated secara dinamik.
Sebagai contoh, pertimbangkan pelaksanaan dipermudahkan std::function untuk fungsi dwi-ke-int:
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); } };
Objek fungsi std:: akan mengandungi unique_ptr kepada kelas asas. Apabila fungsi std:: dibina dengan boleh panggil tertentu, kelas terbitan dicipta dan dijadikan instantiated pada timbunan. Objek std::function itu sendiri kekal dalam saiz tetap, manakala memori untuk objek boleh panggil diperuntukkan secara dinamik.
Mengenai semantik salinan, setiap objek std::function mengekalkan salinan entiti boleh panggil sendiri. Ini terbukti daripada ujian berikut:
fun f1 = [=]() mutable { std::cout << value++ << '\n' }; fun f2 = f1; f1(); f2(); f3();
Output atur cara menunjukkan bahawa f2 dan f3 masing-masing mengekalkan objek boleh panggil yang berasingan, menyebabkan nilai tambahan berbeza dicetak. Oleh itu, std::function mengurus memori untuk objek boleh panggilnya sambil memastikan salinan objek std::function mengekalkan entiti boleh panggil bebas mereka sendiri.
Atas ialah kandungan terperinci Bagaimanakah `std::function` Menguruskan Memori dan Objek Boleh Dipanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!