Mengapakah Lambdas mempunyai Kelebihan Sebaris Berbanding Fungsi dalam Pengoptimuman Pengkompil?

Susan Sarandon
Lepaskan: 2024-11-16 22:55:03
asal
662 orang telah melayarinya

Why do Lambdas have an Inlining Advantage Over Functions in Compiler Optimization?

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

Menyebut "peta" dengan lambda:

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

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan