Ekspresi Lambda dilaksanakan dengan mencipta kelas dengan pengendali panggilan fungsi terlampau beban dan merujuk pembolehubah sebagai ahli. Ini menunjukkan bahawa saiz ungkapan lambda berbeza-beza bergantung pada bilangan pembolehubah yang dirujuk. Walau bagaimanapun, std::function mesti mempunyai saiz tetap. Memahami pelaksanaan std::function adalah penting.
Type Erasure for Variable Size Functors
std::function menggunakan teknik yang dipanggil type-erasure untuk mengendalikan functors of saiz berubah-ubah. Pertimbangkan contoh ringkas fungsi std::yang membalut penuding fungsi kepada int(double):
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) {} virtual int operator()(double d) { return functor(d); } }; class function_int_double { std::unique_ptr<callable_base> c; public: template <typename F> function(F f) { c.reset(new callable<F>(f)); } int operator()(double d) { return c(d); } };
Dalam contoh ini, std::function menyimpan unique_ptr kepada jenis callable_base polimorfik. Untuk functors yang berbeza, jenis baharu yang diperoleh daripada callable_base dicipta dan digunakan secara dinamik. Objek std::function mengekalkan saiz yang konsisten sambil menampung functor pelbagai saiz dalam timbunan.
Penghantaran & Pengoptimuman Dinamik
Untuk meningkatkan prestasi, pelaksanaan dunia sebenar of std::function mengoptimumkan penghantaran dinamik dan memanfaatkan pengoptimuman objek kecil. Walau bagaimanapun, konsep asas tetap sama.
Tingkah laku std::function Copies
Salinan std::function disertakan dengan salinan objek boleh panggil yang terkandung di dalamnya. . Ini disahkan oleh ujian berikut:
int main() { int value = 5; typedef std::function<void()> fun; fun f1 = [=]() mutable { std::cout << value++ << '\n' }; fun f2 = f1; f1(); fun f3 = f1; f2(); f3(); }
Output демонстрирует (5, 5, 6), menunjukkan bahawa salinan objek fungsi dibuat, bukannya berkongsi keadaan.
Pemahaman tentang pelaksanaan std::function ini memastikan penggunaannya yang cekap dengan functors dari pelbagai saiz.
Atas ialah kandungan terperinci Bagaimanakah `std::function` Mengendalikan Fungsi Berubah Saiz?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!