Bolehkah Lambdas Dioptimumkan Lebih Baik Daripada Fungsi Biasa Oleh Penyusun?

Mary-Kate Olsen
Lepaskan: 2024-11-19 18:33:03
asal
203 orang telah melayarinya

Can Lambdas Be Optimized Better Than Plain Functions By Compilers?

Pengoptimuman Pengkompil untuk Lambdas vs. Fungsi Biasa

Dalam bukunya, "The C Standard Library (Edisi Kedua)," dakwa Nicolai Josuttis bahawa lambdas boleh dioptimumkan dengan lebih baik oleh pengkompil daripada fungsi biasa. Ini mungkin kelihatan berlawanan dengan intuisi, memandangkan kedua-dua lambda dan fungsi biasa boleh diselaraskan. Walau bagaimanapun, terdapat perbezaan halus antara kedua-duanya yang membolehkan pengoptimuman yang lebih baik dalam kes lambda.

Perbezaan: Objek Fungsi lwn. Penunjuk Fungsi

Lambda ialah objek fungsi, manakala fungsi biasa pada asasnya adalah penunjuk fungsi. Apabila menghantar lambda kepada templat fungsi, fungsi baharu khusus untuk objek itu dimulakan. Ini membenarkan pengkompil untuk menyelaraskan panggilan lambda secara remeh.

Sebaliknya, menghantar fungsi biasa kepada templat fungsi menyebabkan penuding fungsi dihantar. Penyusun secara historis bergelut dengan panggilan sebaris melalui penunjuk fungsi. Walaupun ia secara teorinya boleh diselaraskan, ia hanya berlaku jika fungsi sekeliling turut diselaraskan.

Contoh

Pertimbangkan templat fungsi berikut:

template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}
Salin selepas log masuk

Memanggilnya dengan lambda:

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

Akan menghasilkan instantiasi yang unik:

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 boleh mengenal pasti operator() lambda dan panggilan sebaris yang remeh kepadanya.

Tetapi apabila dipanggil dengan penuding fungsi:

map(begin(a), end(a), &multiply_by_two);
Salin selepas log masuk

Instasiasi menjadi:

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, f merujuk fungsi berbeza setiap kali peta dipanggil, menghalang pengkompil daripada panggilan sebaris melainkan peta itu sendiri sebaris.

Kesimpulan

Jenis lambda yang unik sebagai objek fungsi membolehkan penyusun mencipta instantiasi fungsi tertentu dan sebaris panggilan mereka dengan lancar. Keupayaan pengoptimuman yang dipertingkatkan ini membezakan lambda daripada fungsi biasa, menjadikannya pilihan pilihan untuk meningkatkan prestasi dan kecekapan kod.

Atas ialah kandungan terperinci Bolehkah Lambdas Dioptimumkan Lebih Baik Daripada Fungsi Biasa Oleh Penyusun?. 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