Rumah >pembangunan bahagian belakang >C++ >std::function vs. Penunjuk Fungsi: Bilakah Anda Harus Pilih Setiap dalam C ?

std::function vs. Penunjuk Fungsi: Bilakah Anda Harus Pilih Setiap dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-11-12 07:38:01533semak imbas

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

std::function vs. Fungsi Penunjuk dalam C : Mana yang Perlu Dipilih dan Bila?

Apabila ia datang untuk mentakrifkan fungsi panggil balik dalam C , anda mempunyai dua pilihan utama: penunjuk fungsi gaya C dan fungsi std::. Pilihan ini boleh memberi kesan ketara kepada keupayaan dan kecekapan kod anda.

Penunjuk Fungsi Gaya-C

Penunjuk fungsi telah wujud sejak sekian lama dan masih digunakan secara meluas. Mereka menawarkan kesederhanaan untuk menyimpan penuding ke fungsi:

void (*callbackFunc)(int);

Walau bagaimanapun, mereka datang dengan had yang ketara:

Ketiadaan Tangkapan Konteks: Penunjuk fungsi tidak boleh mengekalkan konteks (cth., pembolehubah yang ditangkap) fungsi induk. Ini bermakna anda tidak boleh dengan mudah menghantar fungsi lambda atau memanggil fungsi ahli objek sebagai panggilan balik.

std::function

std::function (diperkenalkan dalam C 11) ialah direka untuk mengatasi batasan ini. Ia menyediakan cara generik yang selamat jenis untuk menyimpan dan menghantar fungsi:

std::function< void(int) > callbackFunc;

Kelebihan std::function:

  • Konteks Tangkap: std::function boleh menangkap konteks fungsi induk, membolehkan penggunaan lambdas atau penunjuk fungsi ahli.
  • Storan: std::function boleh disimpan dalam ahli data, menjadikannya sesuai untuk pendaftaran panggil balik dan storan fungsi berterusan.
  • Keserasian Universal: Ia berfungsi dengan semua objek boleh panggil, termasuk penunjuk fungsi, functors dan lambda.

Kelemahan std::function:

  • Overhed Panggilan: Menonaktifkan std::function menimbulkan overhed prestasi yang sedikit berbanding dengan panggilan fungsi langsung .
  • Bukan Sebaris: Panggilan ke std::fungsi tidak sebaris secara lalai, tidak seperti panggilan fungsi langsung.

Parameter Templat

Pilihan ketiga, terutamanya sesuai untuk fungsi kecil, ialah menggunakan parameter templat jenis objek boleh panggil:

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}

Kelebihan Parameter Templat:

  • Sebaris: Panggilan ke fungsi panggil balik diselaraskan, meningkatkan prestasi.
  • Tangkapan Konteks: Membolehkan menangkap konteks juga .

Kelemahan Parameter Templat:

  • Keperluan untuk Pelaksanaan Pengepala: Fungsi yang mengandungi parameter templat mesti dilaksanakan dalam pengepala untuk menyokong maklumat jenis penuh.

Jadual Ringkasan

Untuk meringkaskan, jadual berikut menggariskan perbezaan utama antara pilihan ini:

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

Dalam kebanyakan kes, melainkan anda mempunyai keperluan khusus untuk penunjuk fungsi atau parameter templat, std::function ialah pilihan pilihan kerana fleksibiliti, keupayaan menangkap konteks dan keserasian universal.

Atas ialah kandungan terperinci std::function vs. Penunjuk Fungsi: Bilakah Anda Harus Pilih Setiap dalam C ?. 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