Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `std::function` Mencapai Saiz Tetap Walaupun Membungkus Pemakaian Boleh Panggil Berbeza Saiz?

Bagaimanakah `std::function` Mencapai Saiz Tetap Walaupun Membungkus Pemakaian Boleh Panggil Berbeza Saiz?

DDD
DDDasal
2024-12-02 06:01:10802semak imbas

How Does `std::function` Achieve Fixed Size Despite Wrapping Callables of Varying Sizes?

Cara std::function Dilaksanakan: Type-Erasure dan Timbunan Peruntukan

Perincian pelaksanaan utama std::function ialah keupayaannya untuk membalut sebarang boleh dipanggil, termasuk ungkapan lambda. Walaupun saiz lambda berbeza-beza, fungsi std:: mengekalkan saiz tetap. Ini dicapai melalui teknik yang dipanggil type-erasure.

Ambil contoh ringkas 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) {}
  virtual int operator()(double d) { return functor(d); }
};

Di sini, std::function holds satu_ptr unik kepada jenis asas callable_base. Untuk setiap fungsi unik yang digunakan, jenis terbitan boleh dipanggil dicipta dan dibuat seketika secara dinamik pada timbunan. Ini memastikan objek std::function mengekalkan saiz malar, sambil membenarkan ia membalut sebarang boleh panggil.

Salinan std::function mencetuskan salinan objek boleh panggil dalaman, dan bukannya berkongsi keadaan. Ini terbukti daripada ujian di mana nilai pembolehubah yang ditangkap boleh ubah dinaikkan:

int value = 5;
std::function<void()> f1 = [=]() mutable { std::cout << value++ << '\n'; };
std::function<void()> f2 = f1;
// Prints 5
f1();
// Prints 5 (copy of mutable state)
f2();

Oleh itu, fungsi std:: membungkus pemboleh panggil dengan pelbagai saiz dengan cekap menggunakan pemadaman jenis dan peruntukan timbunan. Peruntukan timbunan digunakan untuk membuat instantiate jenis dinamik berdasarkan pembalut boleh panggil, memastikan saiz tetap untuk std::function itu sendiri.

Atas ialah kandungan terperinci Bagaimanakah `std::function` Mencapai Saiz Tetap Walaupun Membungkus Pemakaian Boleh Panggil Berbeza 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