Mengapa Lambdas Mengungguli Fungsi dalam Pengoptimuman Pengkompil
Dalam bukunya "The C Standard Library (Edisi Kedua)," Nicolai Josuttis mendakwa bahawa lambdas nikmati pengoptimuman pengkompil yang unggul berbanding dengan fungsi biasa. Perbezaan ini berpunca daripada sifat lambda sebagai objek fungsi, membenarkan instantiasi templat fungsi yang disesuaikan dengan objek lambda tertentu.
Kelebihan Inlining untuk Lambdas
Tidak seperti fungsi biasa, yang lulus penunjuk fungsi kepada templat fungsi, lambdas diluluskan sebagai objek fungsi. Ini mencetuskan penciptaan fungsi baharu yang disesuaikan dengan objek lambda tertentu. Akibatnya, pengkompil boleh menyelaraskan panggilan lambda dengan mudah.
Halangan Penunjuk Fungsi
Sebaliknya, fungsi dihalang oleh mekanisme laluannya dalam templat fungsi. Penyusun menghadapi cabaran dalam menyelaraskan panggilan yang dibuat melalui penunjuk fungsi. Walaupun sebarisan teori mungkin, ia memerlukan sebarisan fungsi lampiran juga.
Contoh Instalasi
Pertimbangkan templat fungsi "peta" di bawah:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
Menyebut "peta" dengan lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
Menghasilkan instantiasi berikut:
template <> void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) { for (; begin != end; ++begin) *begin = f.operator()(*begin); }
Pengkompil mengenal pasti operator lambda() dan dengan mudah boleh membuat panggilan sebaris ke ia.
Walau bagaimanapun, apabila "peta" dipanggil dengan penuding fungsi:
template <> void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
Penunjuk fungsi "f" menghala ke lokasi yang berbeza untuk setiap seruan "peta," membuat sukar untuk pengkompil untuk menyelaraskan panggilan "f" sahaja. Inlining memerlukan panggilan "peta" merangkumi untuk diselaraskan juga, membolehkan pengkompil menentukan fungsi khusus yang ditunjuk oleh "f."
Atas ialah kandungan terperinci Mengapakah Lambdas mempunyai Kelebihan Sebaris Berbanding Fungsi dalam Pengoptimuman Pengkompil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!