Mengapa Lambdas Membenarkan Pengoptimuman Pengkompil yang Dipertingkatkan Berbanding dengan Fungsi Biasa
Perpustakaan Standard C (Edisi Kedua) oleh Nicolai Josuttis menegaskan bahawa lambdas boleh dioptimumkan dengan lebih berkesan oleh penyusun berbanding dengan fungsi biasa. Kelebihan ini berpunca daripada sifat lambda sebagai objek fungsi.
Apabila lambda dihantar ke templat fungsi, ia dijadikan seketika sebagai fungsi baharu yang disesuaikan khusus dengan objek tersebut. Ini membolehkan pengkompil untuk menyelaraskan panggilan lambda dengan mudah. Sebaliknya, dengan fungsi biasa, penunjuk fungsi dihantar ke templat fungsi. Secara tradisinya, penyusun menghadapi kesukaran untuk menyelaraskan panggilan yang dibuat melalui penuding fungsi.
Untuk menggambarkan konsep ini, pertimbangkan templat fungsi berikut:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
Menyebut fungsi ini dengan lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
menghasilkan instantiasi yang dicipta oleh pengkompil:
template <> void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) { for (; begin != end; ++begin) *begin = f.operator()(*begin); }
Dalam kes ini, pengkompil mempunyai akses kepada _some_lambda_type::operator() dan boleh membuat panggilan sebaris dengan lancar. Setiap lambda mempunyai jenis yang berbeza, jadi menggunakan lambda yang berbeza dengan map() akan menghasilkan instantiasi baharu.
Walau bagaimanapun, jika penunjuk fungsi digunakan sebaliknya:
map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
Pengkompil akan tidak dapat menyelaraskan panggilan ke f sehingga panggilan merangkumi ke map() juga diselaraskan, membenarkannya untuk menentukan fungsi tertentu. Ini menyerlahkan kelebihan lambda berbanding fungsi biasa dari segi pengoptimuman pengkompil.
Atas ialah kandungan terperinci Mengapakah Lambdas Lebih Dioptimumkan daripada Fungsi Biasa dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!