Mengapakah pengkompil mengoptimumkan fungsi lambda dengan lebih berkesan daripada fungsi tradisional?

DDD
Lepaskan: 2024-11-17 21:22:02
asal
871 orang telah melayarinya

Why does the compiler optimize lambda functions more effectively than traditional functions?

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);
}
Salin selepas log masuk

Menyebutnya dengan a lambda:

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan