Pengoptimuman Pengkompil untuk Lambdas vs. Fungsi Biasa
Dalam bukunya, "The C Standard Library (Edisi Kedua)," dakwa Nicolai Josuttis bahawa lambdas boleh dioptimumkan dengan lebih baik oleh pengkompil daripada fungsi biasa. Ini mungkin kelihatan berlawanan dengan intuisi, memandangkan kedua-dua lambda dan fungsi biasa boleh diselaraskan. Walau bagaimanapun, terdapat perbezaan halus antara kedua-duanya yang membolehkan pengoptimuman yang lebih baik dalam kes lambda.
Perbezaan: Objek Fungsi lwn. Penunjuk Fungsi
Lambda ialah objek fungsi, manakala fungsi biasa pada asasnya adalah penunjuk fungsi. Apabila menghantar lambda kepada templat fungsi, fungsi baharu khusus untuk objek itu dimulakan. Ini membenarkan pengkompil untuk menyelaraskan panggilan lambda secara remeh.
Sebaliknya, menghantar fungsi biasa kepada templat fungsi menyebabkan penuding fungsi dihantar. Penyusun secara historis bergelut dengan panggilan sebaris melalui penunjuk fungsi. Walaupun ia secara teorinya boleh diselaraskan, ia hanya berlaku jika fungsi sekeliling turut diselaraskan.
Contoh
Pertimbangkan templat fungsi berikut:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
Memanggilnya dengan lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
Akan menghasilkan instantiasi yang unik:
template <> void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) { for (; begin != end; ++begin) *begin = f.operator()(*begin); }
Pengkompil boleh mengenal pasti operator() lambda dan panggilan sebaris yang remeh kepadanya.
Tetapi apabila dipanggil dengan penuding fungsi:
map(begin(a), end(a), &multiply_by_two);
Instasiasi menjadi:
template <> void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
Di sini, f merujuk fungsi berbeza setiap kali peta dipanggil, menghalang pengkompil daripada panggilan sebaris melainkan peta itu sendiri sebaris.
Kesimpulan
Jenis lambda yang unik sebagai objek fungsi membolehkan penyusun mencipta instantiasi fungsi tertentu dan sebaris panggilan mereka dengan lancar. Keupayaan pengoptimuman yang dipertingkatkan ini membezakan lambda daripada fungsi biasa, menjadikannya pilihan pilihan untuk meningkatkan prestasi dan kecekapan kod.
Atas ialah kandungan terperinci Bolehkah Lambdas Dioptimumkan Lebih Baik Daripada Fungsi Biasa Oleh Penyusun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!