Rumah >pembangunan bahagian belakang >C++ >Mengapakah Lambdas mempunyai Kelebihan Sebaris Berbanding Fungsi dalam Pengoptimuman Pengkompil?

Mengapakah Lambdas mempunyai Kelebihan Sebaris Berbanding Fungsi dalam Pengoptimuman Pengkompil?

Susan Sarandon
Susan Sarandonasal
2024-11-16 22:55:03754semak imbas

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);
}

Menyebut "peta" dengan lambda:

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

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);
}

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);
}

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!

Kenyataan:
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