Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `std::function` Mengendalikan Fungsi Berubah Saiz?

Bagaimanakah `std::function` Mengendalikan Fungsi Berubah Saiz?

Patricia Arquette
Patricia Arquetteasal
2024-11-30 13:24:11420semak imbas

How Does `std::function` Handle Functors of Variable Sizes?

Pelaksanaan Dalaman std::function

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn