Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah `std::function` Menguruskan Memori dan Objek Boleh Dipanggil?

Bagaimanakah `std::function` Menguruskan Memori dan Objek Boleh Dipanggil?

Patricia Arquette
Lepaskan: 2024-12-01 02:51:17
asal
825 orang telah melayarinya

How Does `std::function` Manage Memory and Callable Objects?

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); }
};
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan