Rumah >pembangunan bahagian belakang >C++ >Mengapakah pengkompil mengoptimumkan fungsi lambda dengan lebih berkesan daripada fungsi tradisional?
Pengoptimuman Lambda dan Fungsi Sebaris: Kelebihan Pengkompil
Pernyataan Nicolai Josuttis bahawa lambdas mempamerkan pengoptimuman pengkompil yang unggul berbanding fungsi biasa telah menarik minat ramai pemaju. Menyiasat dakwaan ini, kami berusaha untuk membongkar sebab asas di sebalik kelebihan pengoptimuman ini.
Objek Fungsi dan Inlining
Lambdas being function objects memiliki kelebihan utama: menghantarnya kepada templat fungsi mencetuskan instantiasi fungsi yang disesuaikan khusus untuk lambda tersebut. Ini membolehkan pengkompil untuk menyelaraskan seruan lambda dengan mudah.
Sebaliknya, fungsi menggunakan penunjuk fungsi apabila dihantar ke templat fungsi. Secara tradisinya, penyusun menghadapi cabaran menyelaraskan panggilan melalui penunjuk fungsi. Pengoptimuman sebaris boleh dilaksanakan hanya jika fungsi lampiran itu sendiri adalah sebaris.
Semerta Templat: Meneroka Perbezaan
Untuk menggambarkan perbezaan ini, pertimbangkan templat fungsi peta:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
Menyebutnya dengan a lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
menghasilkan instantiasi tersuai:
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 fungsi _some_lambda_type::operator() dan boleh terus menyelaraskan panggilan kepadanya. Setiap jenis lambda yang berbeza menggesa instantiasi baharu peta, menjamin pengoptimuman khusus lambda.
Sebaliknya, menggunakan peta dengan penuding fungsi menghasilkan instantiasi berikut:
template <> void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
Di sini, fungsi penunjuk f menunjuk ke alamat yang berbeza-beza untuk setiap panggilan peta, melarang pengoptimuman sebaris. Panggilan untuk memetakan mesti diselaraskan untuk pengkompil menyelesaikan f kepada fungsi tertentu.
Oleh itu, keunikan lambda sebagai objek fungsi dan keupayaannya untuk memudahkan instantiasi templat memperkasakan penyusun dengan keupayaan pengoptimuman yang lebih besar daripada yang digunakan oleh fungsi tradisional melalui penunjuk.
Atas ialah kandungan terperinci Mengapakah pengkompil mengoptimumkan fungsi lambda dengan lebih berkesan daripada fungsi tradisional?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!